<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.    
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia at 2024-03-14 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Apache James Project &#x2013; Apache James Project Guidelines</title>
    <style type="text/css" media="all">
      @import url("./css/james.css");
      @import url("./css/maven-base.css");
      @import url("./css/maven-theme.css");
      @import url("./css/site.css");
      @import url("./js/jquery/css/custom-theme/jquery-ui-1.8.5.custom.css");
      @import url("./js/jquery/css/print.css");
      @import url("./js/fancybox/jquery.fancybox-1.3.4.css");
    </style>
    <script type="text/javascript" src="./js/jquery/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="./js/jquery/js/jquery-ui-1.8.5.custom.min.js"></script>
    <script type="text/javascript" src="./js/fancybox/jquery.fancybox-1.3.4.js"></script>
    <link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
      <meta name="author" content="James Project Web Team" />
    <meta name="Date-Revision-yyyymmdd" content="20240314" />
    <meta http-equiv="Content-Language" content="en" />
        
          <!-- Google Analytics -->
    <script type="text/javascript">
    
      var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-1384591-1']);
      _gaq.push(['_trackPageview']);

      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script').item(0); s.parentNode.insertBefore(ga, s);
      })();

    </script>
    </head>
  <body class="composite">
    <div id="banner">
                                      <a href="index.html" id="bannerLeft" title="james-logo.png">
              
                                                                            
        <img src="images/logos/james-logo.png" alt="James Project" />
                </a>
                              <a href="https://www.apache.org/index.html" id="bannerRight">
              
                                        
        <img src="images/logos/asf_logo_small.png" alt="The Apache Software Foundation" />
                </a>
            <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="breadcrumbs">
            
                
                <div class="xleft">
        <span id="publishDate">Last Published: 2024-03-14</span>
                      </div>
            <div class="xright">                    <a href="index.html" title="Home">Home</a>
            |
                        <a href="documentation.html" title="James">James</a>
            |
                        <a href="mime4j/index.html" title="Mime4J">Mime4J</a>
            |
                        <a href="jsieve/index.html" title="jSieve">jSieve</a>
            |
                        <a href="jspf/index.html" title="jSPF">jSPF</a>
            |
                        <a href="jdkim/index.html" title="jDKIM">jDKIM</a>
              
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
    <div id="leftColumn">
      <div id="navcolumn">
             
                
                                <h5>James components</h5>
                  <ul>
                                                                                                                                                                                                                              <li class="expanded">
                          <a href="documentation.html" title="About James">About James</a>
                    <ul>
                      <li class="none">
                          <a href="mail.html" title="Mailing Lists">Mailing Lists</a>
            </li>
                      <li class="none">
                          <a href="contribute.html" title="Contributing">Contributing</a>
            </li>
                      <li class="none">
            <strong>Guidelines</strong>
          </li>
                      <li class="none">
                          <a href="https://issues.apache.org/jira/browse/JAMES" title="Issue tracker">Issue tracker</a>
            </li>
                      <li class="none">
                          <a href="team-list.html" title="Who We Are">Who We Are</a>
            </li>
                      <li class="none">
                          <a href="license.html" title="License">License</a>
            </li>
                      <li class="none">
                          <a href="thanks.html" title="Thanks">Thanks</a>
            </li>
                      <li class="none">
                          <a href="support.html" title="Professional support">Professional support</a>
            </li>
                      <li class="none">
                          <a href="download.cgi" title="Download releases">Download releases</a>
            </li>
              </ul>
        </li>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      <li class="collapsed">
                          <a href="server/index.html" title="Server">Server</a>
                  </li>
                                                                                                                                                                                                                                                        <li class="collapsed">
                          <a href="mailet/index.html" title="Mailets">Mailets</a>
                  </li>
                                                                                                                                                                                                                                                                                      <li class="collapsed">
                          <a href="mailbox/index.html" title="Mailbox">Mailbox</a>
                  </li>
                                                                                                                                                                                <li class="collapsed">
                          <a href="protocols/index.html" title="Protocols">Protocols</a>
                  </li>
                                                                                                                                                                                      <li class="collapsed">
                          <a href="mpt/index.html" title="MPT">MPT</a>
                  </li>
          </ul>
        <h5>Apache Software Foundation</h5>
  <ul>
    <li>
      <strong>
        <a title="ASF" href="http://www.apache.org/">ASF</a>
      </strong>
    </li>
    <li>
      <a title="Get Involved" href="http://www.apache.org/foundation/getinvolved.html">Get Involved</a>
    </li>
    <li>
      <a title="FAQ" href="http://www.apache.org/foundation/faq.html">FAQ</a>
    </li>
    <li>
      <a title="License" href="http://www.apache.org/licenses/" >License</a>
    </li>
    <li>
      <a title="Sponsorship" href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
    </li>
    <li>
      <a title="Thanks" href="http://www.apache.org/foundation/thanks.html">Thanks</a>
    </li>
    <li>
      <a title="Security" href="http://www.apache.org/security/">Security</a>
    </li>
  </ul>
                       <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
        <img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
      </a>
                   
                
            </div>
    </div>
    <div id="bodyColumn">
      <div id="contentBox">
        

  

    <section>
<h2><a name="Apache_James_Project_Guidelines"></a>Apache James Project Guidelines</h2>
      
<p>
        This document defines the guidelines for the Apache James Project. It
        includes definitions of how conflict is resolved by voting, who
        is able to vote, and the procedures to follow for proposing and
        making changes to the Apache James products.
      </p>
      
<p>
        The objective here is to avoid unnecessary conflict over changes and
        continue to produce a quality system in a timely manner. Not all
        conflict can be avoided, but at least we can agree on the
        procedures for conflict to be resolved.

      </p>
    </section>

    <section>
<h2><a name="People.2C_Places.2C_and_Things"></a>People, Places, and Things</h2>
      <section>
<h3><a name="Apache_James_Project_Management_Committee"></a>Apache James Project Management Committee</h3>
        
<p>
          The group of volunteers who are responsible for managing the Apache
          James Project. This includes deciding what is distributed as
          products of the Apache James Project, maintaining the
          Project's shared resources, speaking on behalf of the Project,
          resolving license disputes regarding Apache James products,
          nominating new PMC members or committers, and establishing
          these guidelines.
        </p>
        
<p>
          Membership in the Apache James PMC is by invitation only and must be approved
          by consensus of the active Apache James PMC members. A PMC
          member is considered inactive by their own declaration or by
          not contributing in any form to the project for over six
          months. An inactive member can become active again by
          reversing whichever condition made them inactive (i.e., by
          reversing their earlier declaration or by once again
          contributing toward the project's work). Membership can be
          revoked by a unanimous vote of all the active PMC members
          other than the member in question.

        </p>
      </section>
      <section>
<h3><a name="Apache_James_Committers"></a>Apache James Committers</h3>
        
<p>
          The group of volunteers who are responsible for the technical aspects
          of the Apache James Project. This group has write access to
          the appropriate source repositories and these volunteers may
          cast non-binding votes on any technical discussion.
        </p>
        
<p>
          Membership as a Committer is by invitation only and must be approved by
          consensus of the active Apache James PMC members. A Committer
          is considered inactive by their own declaration or by not
          contributing in any form to the project for over six months.
          An inactive member can become active again by reversing
          whichever condition made them inactive (i.e., by reversing
          their earlier declaration or by once again contributing toward
          the project's work). Membership can be revoked by a unanimous
          vote of all the active PMC members (except the member in
          question if they are a PMC member).

        </p>
      </section>
      <section>
<h3><a name="Mailing_list"></a>Mailing list</h3>
        
<p>
          The Apache committers' primary mailing list for discussion of issues
          and changes related to the project
          (server-dev@james.apache.org). Subscription to the list is
          open, but only subscribers can post directly to the list.
        </p>
      </section>
      <section>
<h3><a name="Private_list"></a>Private list</h3>
        
<p>
          The Apache James Project's private mailing list for discussion of
          issues that are inappropriate for public discussion, such as
          legal, personal, or security issues prior to a published fix.
          Subscription to the list is only open to Apache James PMC
          members and Apache Software Foundation Members.
        </p>

        
<ul>Topics to be discussed on the private mailing list:

          
<li>Discussion of board reports. PMC members need to report quaterly project activity to the Apache board of directors,
            which is done through <a class="externalLink" href="https://reporter.apache.org">reporter.apache.org</a>. Prior report submission, the draft should
          be discussed on the private mailing list</li>
          
<li>Discussions of <a class="externalLink" href="https://community.apache.org/newcommitter.html">new committers, new PMCs</a>, including proposition
            discussions, votes and process follow up.</li>
          
<li>Handling of <a href="contribute.html#reporting_security_vulnerabilities">security vulnerability reports</a>, and CVE publication.</li>
        </ul>

        
<p>Other topics should be discussed/voted on server-dev instead.</p>
      </section>
      <section>
<h3><a name="GIT"></a>GIT</h3>
        
<p>
          All of the Apache James products are maintained in shared information
          repositories using GIT on git-wip-us.apache.org. The Apache
          committers have write access to these repositories; everyone
          has read access via anonymous GIT.
        </p>
      </section>
    </section>

    <section>
<h2><a name="Consensus"></a>Consensus</h2>
      
<p>
        As a community we are seeking <a class="externalLink" href="https://community.apache.org/committers/decisionMaking.html">consensus</a> in our
        decision making.
      </p>
      
<p>
        We actively rely on <a class="externalLink" href="https://community.apache.org/committers/lazyConsensus.html">lazy consensus</a> for most of our
        decisions, be them validating xref:contributing.adoc#_how_to_contribute_some_code[code changes], enacting
        <a href="contributing.html#a_idea_or_design_proposals">design decisions</a>.
      </p>
    </section>

    <section>
<h2><a name="Voting"></a>Voting</h2>
      
<ul>Some decisions might require to vote:
        
<li>releases</li>
        
<li>establishing a new sub-project</li>
        
<li>retiring sub-projects</li>
        
<li>taking a decision when lazy consensus failed.</li>
      </ul>

      
<p>Note that we encourage discussing the issues prior to trigger a vote. That way bad surprises may be avoided ahead of time.</p>

      
<p>
        Any of the Apache James Committers may vote on any issue or action
        item. However, the only binding votes are those cast by active
        members of the Apache James PMC; if the vote is about a change
        to source code or documentation, the primary author of what is
        being changed may also cast a binding vote on that issue. All
        other votes are non-binding. All committers are encouraged to
        participate in decisions, but the decision itself is made by
        those who have been long-time contributors to the project. In
        other words, the Apache Project is a minimum-threshold
        meritocracy.
      </p>
      
<p>
        The act of voting carries certain obligations -- voting members are not
        only stating their opinion, they are agreeing to help do the
        work of the Apache Project. Since we are all volunteers, members
        often become inactive for periods of time in order to take care
        of their &quot;real jobs&quot; or devote more time to other projects. It
        is therefore unlikely that the entire group membership will vote
        on every issue. To account for this, all voting decisions are
        based on a minimum quorum.
      </p>
      
<p>
        Each vote can be made in one of three flavors:
      </p>
      
<p>
        <b>+1</b>
        <br />
        Yes, agree, or the action should be performed. On some issues,
        this vote is only binding if the voter has tested the action on
        their own system(s).
      </p>
      
<p>
        <b>+-0</b>
        <br />
        Abstain, no opinion, or I am happy to let the other group
        members decide this issue. An abstention may have detrimental
        effects if too many people abstain.
      </p>
      
<p>
        <b>-1</b>
        <br />
        No. On issues where consensus is required, this vote counts as a
        veto. All vetos must include an explanation of why the veto is
        appropriate. A veto with no explanation is void. No veto can be
        overruled. If you disagree with the veto, you should lobby the
        person who cast the veto. Voters intending to veto an action
        item should make their opinions known to the group immediately,
        so that the problem can be remedied as early as possible.
      </p>
      
<p>
        An action item requiring consensus approval must receive at least 3
        binding +1 votes and no vetos. An action item requiring majority
        approval must receive at least 3 binding +1 votes and more +1
        votes than -1 votes (i.e., a majority with a minimum quorum of
        three positive votes). All other action items are considered to
        have lazy approval until someone votes -1, after which point
        they are decided by either consensus or a majority vote,
        depending upon the type of action item.
      </p>
      
<p>
        Votes are to remain open for 72 hours after which the developer who put
        forth the vote should tabulate the result and send this to the
        mailing list. A developer should be sensitive to holidays that
        could dampen participation in the vote.
      </p>
    </section>

    <section>
<h2><a name="Section_for_new_committers"></a>Section for new committers</h2>
      
<p>First congratulation for your involvement!</p>

      As part of the <a class="externalLink" href="https://community.apache.org/newcommitter.html">process to become a committer</a>, the following steps should have had been emailed to you:

      
<ul>
        
<li>Signing of <a class="externalLink" href="https://www.apache.org/licenses/#clas">Contributor License Agreement</a></li>
        
<li>Establishing an Apache profile with the Apache secretary.</li>
        
<li>Access will directly be granted on the<a class="externalLink" href="https://issues.apache.org/jira/projects/JAMES">JIRA</a>,
          the ASF Git repository and the <a class="externalLink" href="https://ci-builds.apache.org/job/james/job/ApacheJames/">ci</a>.</li>
        
<li>Extra steps should be taken for GitHub access (see below).</li>
        
<li>A PMC should have had announced your nomination. If you have not already been doing it, we strongly
        encourage you to write an email on public mailing list, presenting you, and your motivations toward
          contributing on Apache James. A reply to the announce would do the trick!</li>
      </ul>

      <section>
<h3><a name="Accessing_Apache_GitHub_as_a_Committer"></a>Accessing Apache GitHub as a Committer</h3>
      
<ul>
        
<li>Verify you have a GitHub ID enabled with <a class="externalLink" href="https://help.github.com/articles/securing-your-account-with-two-factor-authentication-2fa/">2FA</a></li>
        
<li>Enter your GitHub ID into your <a class="externalLink" href="https://id.apache.org/">Apache ID profile</a></li>
        
<li>Merge your Apache and GitHub accounts using <a class="externalLink" href="https://gitbox.apache.org/setup/">GitBox</a> (Apache Account Linking utility). You should see 3 green checks in GitBox.</li>
      </ul>

      
<p>Wait at least 30  minutes for an email inviting you to Apache GitHub Organization and accept invitation.</p>

      
<p>After accepting the GitHub Invitation verify that you are a member of the <a class="externalLink" href="https://github.com/orgs/apache/teams/james-committers">GitHub Apache James team</a>.</p>

    </section></section>
    
  


      </div>
    </div>
    <div class="clear">
      <hr/>
    </div>
    <div id="footer">
      <div class="xright">Copyright &#169;                    2006-2024
                        <a href="https://www.apache.org/">The Apache Software Foundation</a>.
            All Rights Reserved.      
                
      </div>
      <div class="clear">
        <hr/>
      </div>
    </div>
  </body>
</html>
