# Docker maintainers file
#
# This file describes who runs the Docker 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.bdfl]

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

		text = """
Docker follows the timeless, highly efficient and totally unfair system
known as [Benevolent dictator for
life](http://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
myself 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 core?
	* 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.

Docker 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 Docker, 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. See *review flow*
for details.

Because Docker is such a large and active project, it's important for everyone to know
who is responsible for deciding what. That is determined by a precise set of rules.

* For every *decision* in the project, the rules should designate, in a deterministic way,
who should *decide*.

* For every *problem* in the project, the rules should designate, in a deterministic way,
who should be responsible for *fixing* it.

* For every *question* in the project, the rules should designate, in a deterministic way,
who should be expected to have the *answer*.
"""

	[Rules.review]

		title = "Review flow"

		text = """
Pull requests should be processed according to the following flow:

* For each subsystem affected by the change, the maintainers of the subsystem must approve or refuse it.
It is the responsibility of the subsystem maintainers to process patches affecting them in a timely
manner.

* If the change affects areas of the code which are not part of a subsystem,
or if subsystem maintainers are unable to reach a timely decision, it must be approved by 
the core maintainers.

* If the change affects the UI or public APIs, or if it represents a major change in architecture,
the architects must approve or refuse it.

* If the change affects the operations of the project, it must be approved or rejected by
the relevant operators.

* If the change affects the governance, philosophy, goals or principles of the project,
it must be approved by BDFL.

* A pull request can be in 1 of 5 distinct states, for each of which there is a corresponding label
that needs to be applied. `Rules.review.states` contains the list of states with possible targets
for each.
"""

		# Triage
		[Rules.review.states.0-triage]

			# Maintainers are expected to triage new incoming pull requests by removing
			# the `0-triage` label and adding the correct labels (e.g. `1-design-review`)
			# potentially skipping some steps depending on the kind of pull request.
			# Use common sense for judging.
			#
			# Checking for DCO should be done at this stage.
			#
			# If an owner, responsible for closing or merging, can be assigned to the PR,
			# the better.

			close = "e.g. unresponsive contributor without DCO"
			3-docs-review = "non-proposal documentation-only change"
			2-code-review = "e.g. trivial bugfix"
			1-design-review = "general case"

		# Design review
		[Rules.review.states.1-design-review]

			# Maintainers are expected to comment on the design of the pull request.
			# Review of documentation is expected only in the context of design validation,
			# not for stylistic changes.
			#
			# Ideally, documentation should reflect the expected behavior of the code.
			# No code review should take place in this step.
			#
			# Once design is approved, a maintainer should make sure to remove this label
			# and add the next one.

			close = "design rejected"
			3-docs-review = "proposals with only documentation changes"
			2-code-review = "general case"

		# Code review
		[Rules.review.states.2-code-review]

			# Maintainers are expected to review the code and ensure that it is good
			# quality and in accordance with the documentation in the PR.
			#
			# If documentation is absent but expected, maintainers should ask for documentation.
			#
			# All tests should pass.
			#
			# Once code is approved according to the rules of the subsystem, a maintainer
			# should make sure to remove this label and add the next one.

			close = ""
			1-design-review = "raises design concerns"
			4-merge = "trivial change not impacting documentation"
			3-docs-review = "general case"

		# Docs review
		[Rules.review.states.3-docs-review]

			# Maintainers are expected to review the documentation in its bigger context,
			# ensuring consistency, completeness, validity, and breadth of coverage across
			# all extent and new documentation.
			#
			# They should ask for any editorial change that makes the documentation more
			# consistent and easier to understand.
			#
			# Once documentation is approved, a maintainer should make sure to remove this
			# label and add the next one.

			close = ""
			2-code-review = "requires more code changes"
			1-design-review = "raises design concerns"
			4-merge = "general case"

		# Merge
		[Rules.review.states.4-merge]

			# Maintainers are expected to merge this pull request as soon as possible.
			# They can ask for a rebase, or carry the pull request themselves.
			# These should be the easy PRs to merge.

			close = "carry PR"
			merge = ""

	[Rules.DCO]

	title = "Helping contributors with the DCO"

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

Some Docker 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 substantivly 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.holiday]

	title = "I'm a maintainer, and I'm going on holiday"

	text = """
Please let your co-maintainers and other contributors know by raising a pull
request that comments out your `MAINTAINERS` file entry using a `#`.
"""

	[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 organization
[Org]

	bdfl = "shykes"

	# 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 (for example a plugin system) must
	# be approved by the chief architect.
	"Chief Architect" = "shykes"

	# The Chief Operator is responsible for the day-to-day operations of the project including:
	# - facilitating communications amongst all the contributors;
	# - tracking release schedules;
	# - managing the relationship with downstream distributions and upstream dependencies;
	# - helping new contributors to get involved and become successful contributors and maintainers
	#
	# The role is also responsible for managing and measuring the success of the overall project
	# and ensuring it is governed properly working in concert with the Docker Governance Advisory Board (DGAB).
	"Chief Operator" = "spf13"

	[Org.Operators]

	# The operators make sure the trains run on time. They are responsible for overall operations
	# of the project. This includes facilitating communication between all the participants; helping
	# newcomers get involved and become successful contributors and maintainers; tracking the schedule
	# of releases; managing the relationship with downstream distributions and upstream dependencies;
	# define measures of success for the project and measure progress; Devise and implement tools and
	# processes which make contributors and maintainers happier and more efficient.


		[Org.Operators.security]

			people = [
				"erw"
			]

		[Org.Operators."monthly meetings"]

			people = [
				"sven",
				"tianon"
			]

		[Org.Operators.infrastructure]

			people = [
				"jfrazelle",
				"crosbymichael"
			]

	# 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".
	"Chief Maintainer" = "crosbymichael"

	[Org."Core maintainers"]

	# The Core maintainers are the ghostbusters of the project: when there's a problem others
	# can't solve, they show up and fix it with bizarre devices and weaponry.
	# They have final say on technical implementation and coding style.
	# They are ultimately responsible for quality in all its forms: usability polish,
	# bugfixes, performance, stability, etc. When ownership  can cleanly be passed to
	# a subsystem, they are responsible for doing so and holding the
	# subsystem maintainers accountable. If ownership is unclear, they are the de facto owners.

	# For each release (including minor releases), a "release captain" is assigned from the
	# pool of core maintainers. Rotation is encouraged across all maintainers, to ensure
	# the release process is clear and up-to-date.
	#
	# It is common for core maintainers to "branch out" to join or start a subsystem.



		people = [
			"unclejack",
			"crosbymichael",
			"erikh",
			"icecrime",
			"jfrazelle",
			"lk4d4",
			"tibor",
			"vbatts",
			"vieux",
			"vish"
		]


	[Org.Subsystems]

	# As the project grows, it gets separated into well-defined subsystems. Each subsystem
	# has a dedicated group of maintainers, which are dedicated to that subsytem and responsible
	# for its quality.
	# This "cellular division" is the primary mechanism for scaling maintenance of the project as it grows.
	# 
	# The maintainers of each subsytem are responsible for:
	# 
	# 1. Exposing a clear road map for improving their subsystem.
	# 2. Deliver prompt feedback and decisions on pull requests affecting their subsystem.
	# 3. Be available to anyone with questions, bug reports, criticism etc.
	#   on their component. This includes IRC, GitHub requests and the mailing
	#   list.
	# 4. Make sure their subsystem respects the philosophy, design and
	#   road map of the project.
	#
	# #### How to review patches to your subsystem
	# 
	# Accepting pull requests:
	# 
	#   - If the pull request appears to be ready to merge, give it a `LGTM`, which
	#     stands for "Looks Good To Me".
	#   - If the pull request has some small problems that need to be changed, make
	#     a comment adressing the issues.
	#   - If the changes needed to a PR are small, you can add a "LGTM once the
	#     following comments are adressed..." this will reduce needless back and
	#     forth.
	#   - If the PR only needs a few changes before being merged, any MAINTAINER can
	#     make a replacement PR that incorporates the existing commits and fixes the
	#     problems before a fast track merge.
	# 
	# Closing pull requests:
	# 
	#   - If a PR appears to be abandoned, after having attempted to contact the
	#     original contributor, then a replacement PR may be made.  Once the
	#     replacement PR is made, any contributor may close the original one.
	#   - If you are not sure if the pull request implements a good feature or you
	#     do not understand the purpose of the PR, ask the contributor to provide
	#     more documentation.  If the contributor is not able to adequately explain
	#     the purpose of the PR, the PR may be closed by any MAINTAINER.
	#   - If a MAINTAINER feels that the pull request is sufficiently architecturally
	#     flawed, or if the pull request needs significantly more design discussion
	#     before being considered, the MAINTAINER should close the pull request with
	#     a short explanation of what discussion still needs to be had.  It is
	#     important not to leave such pull requests open, as this will waste both the
	#     MAINTAINER's time and the contributor's time.  It is not good to string a
	#     contributor on for weeks or months, having them make many changes to a PR
	#     that will eventually be rejected.

		[Org.Subsystems.Documentation]

			people = [
				"fredlf",
				"james",
				"sven",
			]

		[Org.Subsystems.libcontainer]

			people = [
				"crosbymichael",
				"vmarmol",
				"mpatel",
				"jnagal",
				"lk4d4"
			]

		[Org.Subsystems.registry]

			people = [
				"dmp42",
				"vbatts",
				"joffrey",
				"samalba"
			]

		[Org.Subsystems."build tools"]

			people = [
				"shykes",
				"tianon"
			]

		[Org.Subsystem."remote api"]

			people = [
				"vieux"
			]

		[Org.Subsystem.swarm]

			people = [
				"aluzzardi",
				"vieux"
			]

		[Org.Subsystem.machine]

			people = [
				"bfirsh",
				"ehazlett"
			]

		[Org.Subsystem.compose]

			people = [
				"aanand"
			]

		[Org.Subsystem.builder]

			people = [
				"erikh",
				"tibor",
				"duglin"
			]


[people]

# A reference list of all people associated with the project.
# All other sections should refer to people by their canonical key
# in the people section.

	# ADD YOURSELF HERE IN ALPHABETICAL ORDER

	[people.aanand]
	Name = "Aanand Prasad"
	Email = "aanand@docker.com"
	GitHub = "aanand"

	[people.aluzzardi]
	Name = "Andrea Luzzardi"
	Email = "aluzzardi@docker.com"
	GitHub = "aluzzardi"

	[people.bfirsh]
	Name = "Ben Firshman"
	Email = "ben@firshman.co.uk"
	GitHub = "bfirsh"

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

	[people.duglin]
	Name = "Doug Davis"
	Email = "dug@us.ibm.com"
	GitHub = "duglin"

	[people.ehazlett]
	Name = "Evan Hazlett"
	Email = "ejhazlett@gmail.com"
	GitHub = "ehazlett"

	[people.erikh]
	Name = "Erik Hollensbe"
	Email = "erik@docker.com"
	GitHub = "erikh"

	[people.erw]
	Name = "Eric Windisch"
	Email = "eric@windisch.us"
	GitHub = "ewindisch"

	[people.icecrime]
	Name = "Arnaud Porterie"
	Email = "arnaud@docker.com"
	GitHub = "icecrime"

	[people.jfrazelle]
	Name = "Jessie Frazelle"
	Email = "jess@docker.com"
	GitHub = "jfrazelle"

	[people.lk4d4]
	Name = "Alexander Morozov"
	Email = "lk4d4@docker.com"
	GitHub = "lk4d4"

	[people.shykes]
	Name = "Solomon Hykes"
	Email = "solomon@docker.com"
	GitHub = "shykes"
    
	[people.spf13]
	Name = "Steve Francia"
	Email = "steve.francia@gmail.com"
	GitHub = "spf13"
	
	[people.sven]
	Name = "Sven Dowideit"
	Email = "SvenDowideit@home.org.au"
	GitHub = "SvenDowideit"

	[people.tianon]
	Name = "Tianon Gravi"
	Email = "admwiggin@gmail.com"
	GitHub = "tianon"

	[people.tibor]
	Name = "Tibor Vass"
	Email = "tibor@docker.com"
	GitHub = "tiborvass"

	[people.vbatts]
	Name = "Vincent Batts"
	Email = "vbatts@redhat.com"
	GitHub = "vbatts"

	[people.vieux]
	Name = "Victor Vieux"
	Email = "vieux@docker.com"
	GitHub = "vieux"

	[people.vmarmol]
	Name = "Victor Marmol"
	Email = "vmarmol@google.com"
	GitHub = "vmarmol"

	[people.jnagal]
	Name = "Rohit Jnagal"
	Email = "jnagal@google.com"
	GitHub = "rjnagal"

	[people.mpatel]
	Name = "Mrunal Patel"
	Email = "mpatel@redhat.com"
	GitHub = "mrunalp"

	[people.unclejack]
	Name = "Cristian Staretu"
	Email = "cristian.staretu@gmail.com"
	GitHub = "unclejack"

	[people.vish]
	Name = "Vishnu Kannan"
	Email = "vishnuk@google.com"
	GitHub = "vishh"
