# containerd project maintainers file
#
# This file describes who runs the containerd project and how.
# This is a living document - if you see something out of date or missing,
# speak up!
#
# It is structured to be consumable by both humans and programs.
# To extract its contents programmatically, use any TOML-compliant
# parser.

[Rules]

	[Rules.maintainers]

	title = "What is a maintainer?"

	text = """
There are different types of maintainers, with different responsibilities, but
all maintainers have 3 things in common:

1) They share responsibility in the project's success.
2) They have made a long-term, recurring time investment to improve the project.
3) They spend that time doing whatever needs to be done, not necessarily what
is the most interesting or fun.

Maintainers are often under-appreciated, because their work is harder to appreciate.
It's easy to appreciate a really cool and technically advanced feature. It's harder
to appreciate the absence of bugs, the slow but steady improvement in stability,
or the reliability of a release process. But those things distinguish a good
project from a great one.
"""

	[Rules.adding-maintainers]

	title = "How are maintainers added?"

	text = """
Maintainers are first and foremost contributors that have shown they are
committed to the long term success of a project. Contributors wanting to become
maintainers are expected to be deeply involved in contributing code, pull
request review, and triage of issues in the project for more than three months.

Just contributing does not make you a maintainer, it is about building trust
with the current maintainers of the project and being a person that they can
depend on and trust to make decisions in the best interest of the project.

Periodically, the existing maintainers curate a list of contributors that have
shown regular activity on the project over the prior months. From this list,
maintainer candidates are selected and proposed on the maintainers mailing list.

After a candidate has been announced on the maintainers mailing list, the
existing maintainers are given five business days to discuss the candidate,
raise objections and cast their vote. Candidates must be approved by the BDFL
and at least 66% of the current maintainers by adding their vote on the mailing
list. Only maintainers of the repository that the candidate is proposed for are
allowed to vote. The BDFL's vote is mandatory.

If a candidate is approved, a maintainer will contact the candidate to invite
the candidate to open a pull request that adds the contributor to the
MAINTAINERS file. The candidate becomes a maintainer once the pull request is
merged.
"""

	[Rules.adding-sub-projects]

	title = "How are sub projects added?"

	text = """
Similar to adding maintainers, new sub projects can be added to containerd
GitHub organization as long as they adhere to the CNCF
[charter](https://www.cncf.io/about/charter/) and mission. After a project
proposal has been announced on a public forum (GitHub issue or mailing list),
the existing maintainers are  given five business days to discuss the new
project, raise objections and cast their vote. Projects must be approved by at
least 66% of the current maintainers by adding their vote.

If a project is approved, a maintainer will add the project to the containerd
GitHub organization, and make an announcement on a public forum.
"""

	[Rules.stepping-down-policy]

	title = "Stepping down policy"

	text = """
Life priorities, interests, and passions can change. If you're a maintainer but
feel you must remove yourself from the list, inform other maintainers that you
intend to step down, and if possible, help find someone to pick up your work.
At the very least, ensure your work can be continued where you left off.

After you've informed other maintainers, create a pull request to remove
yourself from the MAINTAINERS file.
"""

	[Rules.inactive-maintainers]

	title = "Removal of inactive maintainers"

	text = """
Similar to the procedure for adding new maintainers, existing maintainers can
be removed from the list if they do not show significant activity on the
project. Periodically, the maintainers review the list of maintainers and their
activity over the last three months.

If a maintainer has shown insufficient activity over this period, a neutral
person will contact the maintainer to ask if they want to continue being
a maintainer. If the maintainer decides to step down as a maintainer, they
open a pull request to be removed from the MAINTAINERS file.

If the maintainer wants to remain a maintainer, but is unable to perform the
required duties they can be removed with a vote by the BDFL and at least 66% of
the current maintainers. The BDFL's vote is mandatory. An e-mail is sent to the
mailing list, inviting maintainers of the project to vote. The voting period is
five business days. Issues related to a maintainer's performance should be
discussed with them among the other maintainers so that they are not surprised
by a pull request removing them.
"""

	[Rules.bdfl]

	title = "The Benevolent dictator for life (BDFL)"

	text = """
containerd follows the timeless, highly efficient and totally unfair system
known as [Benevolent dictator for
life](https://en.wikipedia.org/wiki/Benevolent_Dictator_for_Life), with yours
truly, Solomon Hykes, in the role of BDFL. This means that all decisions are
made, by default, by Solomon. Since making every decision himself would be
highly un-scalable, in practice decisions are spread across multiple
maintainers.

Ideally, the BDFL role is like the Queen of England: awesome crown, but not an
actual operational role day-to-day. The real job of a BDFL is to NEVER GO AWAY.
Every other rule can change, perhaps drastically so, but the BDFL will always be
there, preserving the philosophy and principles of the project, and keeping
ultimate authority over its fate. This gives us great flexibility in
experimenting with various governance models, knowing that we can always press
the "reset" button without fear of fragmentation or deadlock. See the US
congress for a counter-example.

BDFL daily routine:

* Is the project governance stuck in a deadlock or irreversibly fragmented?
	* If yes: refactor the project governance
* Are there issues or conflicts escalated by maintainers?
	* If yes: resolve them
* Go back to polishing that crown.
"""

	[Rules.decisions]

	title = "How are decisions made?"

	text = """
Short answer: EVERYTHING IS A PULL REQUEST.

containerd is an open-source project with an open design philosophy. This means
that the repository is the source of truth for EVERY aspect of the project,
including its philosophy, design, road map, and APIs. *If it's part of the
project, it's in the repo. If it's in the repo, it's part of the project.*

As a result, all decisions can be expressed as changes to the repository. An
implementation change is a change to the source code. An API change is a change
to the API specification. A philosophy change is a change to the philosophy
manifesto, and so on.

All decisions affecting containerd, big and small, follow the same 3 steps:

* Step 1: Open a pull request. Anyone can do this.

* Step 2: Discuss the pull request. Anyone can do this.

* Step 3: Merge or refuse the pull request. Who does this depends on the nature
of the pull request and which areas of the project it affects.
"""

	[Rules.DCO]

	title = "Helping contributors with the DCO"

	text = """
The [DCO or `Sign your work`](
https://github.com/containerd/containerd/blob/master/CONTRIBUTING.md#sign-your-work)
requirement is not intended as a roadblock or speed bump.

Some containerd contributors are not as familiar with `git`, or have used a web
based editor, and thus asking them to `git commit --amend -s` is not the best
way forward.

In this case, maintainers can update the commits based on clause (c) of the DCO.
The most trivial way for a contributor to allow the maintainer to do this, is to
add a DCO signature in a pull requests's comment, or a maintainer can simply
note that the change is sufficiently trivial that it does not substantially
change the existing contribution - i.e., a spelling change.

When you add someone's DCO, please also add your own to keep a log.
"""

	[Rules."no direct push"]

	title = "I'm a maintainer. Should I make pull requests too?"

	text = """
Yes. Nobody should ever push to master directly. All changes should be
made through a pull request.
"""

	[Rules.meta]

	title = "How is this process changed?"

	text = "Just like everything else: by making a pull request :)"

# Current project roles
[Roles]

	[Roles.bdfl]

	person = "shykes"

	[Roles."Chief Architect"]

	person = "crosbymichael"

	text = """
The chief architect is responsible for the overall integrity of the technical
architecture across all subsystems, and the consistency of APIs and UI.

Changes to UI, public APIs and overall architecture must be approved by the
chief architect.
"""

	[Roles."Chief Maintainer"]

	person = "crosbymichael"

	text = """
The chief maintainer is responsible for all aspects of quality for the project
including code reviews, usability, stability, security, performance, etc.  The
most important function of the chief maintainer is to lead by example. On the
first day of a new maintainer, the best advice should be "follow the C.M.'s
example and you'll be fine".
"""

# Current project organization
[Org]

	[Org.Maintainers]
	people = [
		"crosbymichael",
		"dqminh",
		"dmcgowan",
		"estesp",
		"hqhq",
		"jhowardmsft",
		"mlaventure",
		"stevvooe",
	]

[People]

	[People.crosbymichael]
	Name = "Michael Crosby"
	Email = "crosbymichael@gmail.com"
	GitHub = "crosbymichael"

	[People.dqminh]
	Name = "Daniel, Dao Quang Minh"
	Email = "dqminh89@gmail.com"
	GitHub = "dqminh"

	[people.dmcgowan]
	Name = "Derek McGowan"
	Email = "derek@mcgstyle.net"
	GitHub = "dmcgowan"

	[People.estesp]
	Name = "Phil Estes"
	Email = "estesp@gmail.com"
	GitHub = "estesp"

	[People.hqhq]
	Name = "Qiang Huang"
	Email = "h.huangqiang@huawei.com"
	GitHub = "hqhq"

	[People.jhowardmsft]
	Name = "John Howard"
	Email = "jhoward@microsoft.com"
	GitHub = "jhowardmsft"

	[People.mlaventure]
	Name = "Kenfe-Mickaël Laventure"
	Email = "mickael.laventure@docker.com"
	GitHub = "mlaventure"

	[People.stevvooe]
	Name = "Stephen Day"
	Email = "stephen.day@docker.com"
	GitHub = "stevvooe"
