content/dev/voting.html (331 lines of code) (raw):
<HTML>
<HEAD>
<TITLE>Apache voting rules and guidelines</TITLE>
</HEAD>
<!-- Background white, links blue (unvisited), navy (visited), red (active) -->
<BODY
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#000080"
ALINK="#FF0000"
>
<H1>This document is now obsolete. Please refer to <A
HREF="guidelines.html">the Apache Project guidelines</A> for
up-to-date info.</H1>
<H1 ALIGN=CENTER>
<IMG SRC="images/apache_logo.gif" ALT=""><BR>
Apache voting rules and guidelines
</H1>
<P>
This document defines the rules and guidelines for Apache Group members
to follow when voting on patches, documentation, or other action items
to be applied to the Apache HTTP Server.
</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>
<P>
Some abbreviations used below...
</P>
<DL>
<DT><STRONG>mailing list</STRONG></DT>
<DD>The Apache developers' mailing list.
Subscription to the list is by invitation only, and only subscribers
can post directly to the list.</DD>
<DT><STRONG>CURRENT</STRONG></DT>
<DD>The most recent version of the source. Used as
the base code into which new patches are to be merged.</DD>
<DT><STRONG>C_VERSION</STRONG></DT>
<DD>The version number of <STRONG>CURRENT</STRONG>.</DD>
<DT><STRONG>NEXT</STRONG></DT>
<DD>The next version of the source. The product of
applying approved patches to <STRONG>CURRENT</STRONG></DD>
</DL>
<HR SIZE=6>
<H2><IMG SRC="images/apache_feather_bullet.gif" ALT="o ">
Issues and Action Items</H2>
Many issues will be encountered by the project, each resulting in zero
or more proposed action items. All action items may be voted on, but not all
of them will require a formal vote. Issues should be raised on the
mailing list as soon as they are identified. Action items
<STRONG>must</STRONG> be raised on the mailing list.
<H3>Types of Action Items</H3>
<DL>
<DT><STRONG>Code Changes</STRONG></DT>
<DD>Code changes require peer review and testing over a wide range
of server platforms. Therefore, all code changes must pass through
a formal "patch vote", as described <A HREF="#patchvote">below</A>.
All those participating in a patch vote must be willing and able
to test the patched system.</DD>
<DT><STRONG>Documentation Changes</STRONG></DT>
<DD>Documentation changes are only voted on after (or during) the change.
The author of the changes must notify the mailing list, preferably
in advance of the work to avoid duplicate efforts, of where the
changes are being made. If the changes are to existing documents,
the existing documents should not be replaced until at least
24 hours after notifying the list. Any group member may veto a
change, but must then provide real assistance to the author
in correcting the problem if it can be corrected, and must rescind
the veto once the problem has been corrected (this may be assumed
in good faith).</DD>
<DT><STRONG>Long Term Plans</STRONG></DT>
<DD>Long term plans are simply announcements that group members
are working on particular issues related to the Apache software.
These are not voted on,
but group members who do not agree with a particular plan,
or think an alternate plan would be better, are obligated to
inform the group of their feelings. In general, it is always
better to hear about alternate plans <STRONG>prior</STRONG> to
spending time on less adequate solutions.
</DL>
<H2><IMG SRC="images/apache_feather_bullet.gif" ALT="o ">
Casting Votes</H2>
<P>
Anyone on the mailing list may vote on any issue. However, 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.</P>
<P>Each vote can be made in one of three flavors:
<DL COMPACT>
<DT><STRONG>+1</STRONG></DT>
<DD> Yes, agree, or the action should be performed. On some issues, this
vote must only be given after the voter has tested the action on
their own system(s).
</DD><P>
<DT><STRONG>±0</STRONG></DT>
<DD> Abstain, no opinion, or I am happy to let the other group members
decide this issue. An abstention may have detrimental affects if
too many people abstain.
</DD><P>
<DT><STRONG>-1</STRONG></DT>
<DD> No, I <STRONG>veto</STRONG> this action. All vetos must include
an explanation of why the veto is appropriate. A veto with
no explanation is void.
</DD>
</DL>
<P>All votes must be sent to the mailing list.
<H2><IMG SRC="images/apache_feather_bullet.gif" ALT="o ">
<A NAME="patchvote">Formal Patch Votes</A></H2>
<P>
As mentioned above, changes to the source code require peer review
and adequate testing across many platforms. The formal patch vote
rules are intended to ensure that this happens even when we are all in a
hurry to see things fixed. However, also see the section on
<A
HREF="#lazy-voting"
>lazy voting</A>
mode.
</P>
<P>There are four distinct roles in the patch vote process, each of which
may be shared by multiple group members: patch provider, vote coordinator,
voter, and version builder.
<P>Patch providers include anyone that has an action item to propose.
Unless it is infeasible to do so, source code changes must be proposed in
the form of input to the patch command. Feasibility is defined by each
voter and the version builder(s), who may veto an action item if the
action requires effort beyond what they are expected to perform.
<H3>Uploading an Action Item</H3>
<P>Action items (usually patches) are uploaded to hyperreal (apache.org)
via FTP, either directly into the directory for patches to <STRONG>CURRENT</STRONG>
(/httpd/patches/for_Apache_<STRONG>C_VERSION</STRONG>/), or into an incoming
FTP directory for later transfer into the patch directory.<P>
<P>Each filename should at least hint at the action objective and
include reference to:
<OL>
<LI>(C_VERSION) the version number of <STRONG>CURRENT</STRONG></LI>
<LI>(ID) the unique action item numeric ID</LI>
<LI>(p) the patch letter, if an alternate patchfile is proposed</LI>
</OL>
<P>The syntax for filenames not containing patches is:
<PRE> ID.description</PRE>
e.g.,<BR>
<PRE> 01.Modula3_rewrite</PRE>
if the action item is not (yet) in the form of a patch.
<P>The syntax for filenames containing patches is:
<PRE> IDp.description.<STRONG>C_VERSION</STRONG>.patch</PRE>
e.g., <BR>
<PRE> 01.ScriptAliasKaboom.0.8.11.patch
01a.ScriptAliasKaboom.0.8.11.patch
01b.ScriptAliasKaboom.0.8.11.patch</PRE>
<P>The ID number should start at 01, and be incremented for each new
action item uploaded.</P>
<H3>Action Item Format</H3>
<P>An action item should contain a list of header information
(formatted like e-mail or HTTP headers):
<DL>
<DT><STRONG>From:</STRONG></DT>
<DD>A list of patch authors and/or people who identified the problem.
<DT><STRONG>Subject:</STRONG></DT>
<DD>A description of the problem being addressed.
<DT><STRONG>Requires:</STRONG></DT>
<DD>A list of other patches that must be applied before this one.
<DT><STRONG>Affects:</STRONG></DT>
<DD>A list of source file names that this patch affects
<DT><STRONG>Changelog:</STRONG></DT>
<DD>A couple of lines for use in a future changelog, so that the
patch (if accepted) can be recorded.
<DT><STRONG>Comments:</STRONG></DT>
<DD>Any additional comments about the problem.
</DL>
followed by an empty line and then the patch (if any).
<H3>Patch Format</H3>
<P>The patch should be created by using <CODE>diff -u</CODE> on the
<STRONG>CURRENT</STRONG> source and the modified source. E.g.,</P>
<PRE> diff -u http_main.c.orig http_main.c</PRE>
<P>All patches necessary to address an action item must be concatenated
within a single patchfile. The source files affected by the patchfile
should be listed in an Affects header.</P>
<P>The completed patchfile should produce no errors or prompts when the
command,</P>
<PRE> patch -s < patchfile</PRE>
is issued.
<P>If the patch produces errors or prompts, then it may be rejected by
others. Problems with patches should be reported to the mailing list
as soon as they are noticed. Dependencies between patches must be
noted with a Requires line in the patchfile headers.</P>
<H3>Alternate Patches</H3>
<P>Once uploaded, changes to the contents of a patchfile are limited
to the header information (i.e., everything other than the patch itself).
For example, the Changelog entry can be changed, but not the output
of the <CODE>diff</CODE> command(s).
<P>Should the patch itself need changing, a new patchfile should be created
with a new patchletter after the ID. Anyone can upload a patch to address
a single problem, so alternative patches can be offered for the same problem.
The author of the patch is the only person allowed to (or give permission to)
have an existing patch removed. Removal of a patch means removal of the
patchfile.</P>
<P>Each patchfile is voted on independently. New alternate patches must
garner their own votes -- they do not automatically inherit the votes
for patches they replace.</P>
<P>Patches for <STRONG>CURRENT</STRONG> can be uploaded at any time before or
during a voting session.</P>
<H3>The Voting Session</H3>
<P>A voting session can be initiated by anyone so long as a volunteer
or volunteers can be found to:
<UL>
<LI>be the vote coordinator: collect the votes cast by group members</LI>
<LI>be the version builder: apply approved patches to create the
<STRONG>NEXT</STRONG> version of the system.</LI>
</UL>
<P>The person or persons volunteering to perform these tasks agree
on a timetable and announce it on the mailing list. The important
part of the timetable is the vote deadline, which specifies when
the votes will be tallied and the new version can be built.
Unless it is an <A HREF="#emergency">emergency</A>, the initial
deadline should be at least three days after the announcement.</P>
<P>The vote deadline can be moved if, using the same voting rules
as for patches, there are enough votes and no vetos. The current deadline
cannot be voted on.</P>
<P>Group members can vote and comment on the patches under consideration
as often as they want. The final vote (if votes are changed) of a person
is assumed to invalidate previous votes.</P>
<P>Votes are cast as follows;
<DL COMPACT>
<DT><STRONG>+1</STRONG></DT>
<DD> can be given to a patch if the person has,
<OL>
<LI>read the patch header to see what problem it addresses</LI>
<LI>successfully patched it into <STRONG>CURRENT</STRONG></LI>
<LI>observed no bad side-effects resulting from the patch.</LI>
</OL>
</DD><P>
<DT><STRONG>-1</STRONG></DT>
<DD> is a veto on the patch. All vetos must come
with an explanation of why the veto is appropriate. A veto with
no explanation is void.
</DD>
</DL>
<P>No veto can be overruled. If you disagree with the veto, you
should lobby the person who cast the veto. Voters intending to veto
a patch should make their opinions known to the group immediately,
so that the problem can be remedied prior to the vote deadline, if
possible.</P>
<H3>Vote Collection</H3>
<P>Votes are tallied by the vote coordinator as soon as the final
vote deadline has passed. The results of the vote are then posted
to the mailing list.</P>
<P><STRONG>In order to be approved, an action item file must receive
at least 3 positive votes and NO vetos.</STRONG></P>
<P>Late <STRONG>+1</STRONG> votes can be ignored or accepted by the vote coordinator
at his/her discretion. A late veto has no value: It can only be used
to try to convince positive voters to rethink. If a positive voter changes
to a veto, that veto is valid even though it is late.</P>
<H3>Release Build and Announcement</H3>
<P>After the vote coordinator gives the version builder the results,
<STRONG>NEXT</STRONG> is created by applying the approved patches
to <STRONG>CURRENT</STRONG>, making the changes called for by other approved
(non-patch) action items, adding the approved action item descriptions
to the changelog, and incrementing the version number.</P>
<P><STRONG>NEXT</STRONG> is then uploaded by the version builder to hyperreal
and placed in the pre-release directory (/httpd/dist) in compressed
and gzip'd tar files that name the new version number. The availability
of the new version is then announced on the private mailing list.</P>
<P>After the version announcement, accidental mistakes made by the builder
can be rectified without a vote, but must be announced to the group.</P>
<P>Unless stated otherwise at the start of the vote session, <STRONG>NEXT</STRONG>
is assumed to be intended for public release. If an objection to the
public release is put forward, a majority decision vote will determine
whether or not the release is made public. Unlike the other votes,
a minority opinion cannot stop a public release.</P>
<P>If <STRONG>NEXT</STRONG> is to be released publically, everyone on the mailing
list should make the effort to download it and try it out. <STRONG>NEXT</STRONG>
should not be publically released until 24 hours after it has been created
and announced to the group.</P>
<P>If one of the patches used to create <STRONG>NEXT</STRONG> is subsequently
found to cause a more serious problem than those it fixed, this problem
should be reported to the group and any public release postponed until
a majority decision on how to rectify the problem is obtained.</P>
<H3><A NAME="emergency">Emergency Patch Votes</A></H3>
<P>In the event of an emergency patch/vote session to fix a security
problem, the group may need to bypass the normal operating procedures
described above in order to get a fix in place prior to any public
announcement of the problem. Any group member may announce an emergency
on the mailing list and is encouraged to do so immediately if notified
about a severe problem. Any group member may veto an emergency in order
to force it through the normal procedures.</P>
<P>Patches created to solve an emergency problem may be linked directly
from the Apache home page as soon as the patch has been created and
tested by its author. However, this link must be removed or changed
if the original patch is vetoed.</P>
<P>The availability of an emergency patch may be announced to the public
after 24hours or three +1 votes are given for the patch, whichever comes
first.</P>
<H2>
<A NAME="lazy-voting">
Lazy-Voting Mode
</A>
</H2>
<P>
At some times, such as early in the devlopment cycle, it may be
desirable to operate in what has been called "lazy" voting
mode. This is essentially identical to the
<A
HREF="#patchvote"
>formal voting process</A>,
except that "silence gives assent" -- if 48 hours pass without
a veto, a quorum of "aye" votes is assumed even not officially
collected.
</P>
<P>
Formal and lazy voting environments may co-exist; some topics may
require formal votes whilst others may not. Common sense should be
exercised, and potentially highly-controversial patches shouldn't
be submitted under the lazy rules.
</P>
<P>
When a patch submitter expects to take advantage of lazy voting mode, it
<EM>must</EM> be explicitly stated in the patch submission.
</P>
<HR SIZE=6>
<ADDRESS>
Rob Hartill and Roy Fielding<BR>
3 September 1995
</ADDRESS>
<ADDRESS>
Modified 26 August 1997 by Ken Coar
</ADDRESS>
</BODY>
</HTML>