|
| 1 | +# Governance |
| 2 | + |
| 3 | +This file says who can do what in the MetaObjects project, how someone earns more rights, and |
| 4 | +how decisions are made. [MAINTAINERS.md](MAINTAINERS.md) lists who holds each role today. |
| 5 | + |
| 6 | +MetaObjects is primarily a one-person, part-time project. Today the creator, Doug Mealing, is the |
| 7 | +only maintainer. These rules are written down now so that a second maintainer knows the terms |
| 8 | +before putting in time. |
| 9 | + |
| 10 | +## Roles |
| 11 | + |
| 12 | +There are three roles. |
| 13 | + |
| 14 | +| Role | Who | What they can do | |
| 15 | +|---|---|---| |
| 16 | +| Contributor | Anyone who opens an issue, a pull request, a review or a discussion | Propose changes. Review any pull request. Their reviews count toward earning a maintainer role | |
| 17 | +| Port maintainer | Someone who owns one area: a language port, the web client, the docs, a generator family or a library (the areas are listed in [MAINTAINERS.md](MAINTAINERS.md)) | Review and merge pull requests that stay inside their area. Triage and label its issues. Publish that area's registry packages once publish rights are granted (see below) | |
| 18 | +| Core maintainer | Someone responsible for the project as a whole | Everything a port maintainer can do, in every area. Approve changes to the model format, ADRs and releases. Grant and remove roles | |
| 19 | + |
| 20 | +A person can maintain more than one area. Core maintainers can merge in any area, but should |
| 21 | +leave a pull request to the area's port maintainer when there is one. |
| 22 | + |
| 23 | +## How rights are earned |
| 24 | + |
| 25 | +### Becoming a port maintainer |
| 26 | + |
| 27 | +The usual bar is: |
| 28 | + |
| 29 | +- at least 5 merged pull requests in the area, and |
| 30 | +- about 2 months of reviewing other people's pull requests in that area. |
| 31 | + |
| 32 | +Anyone can propose a person, including themselves, by opening an issue that links the merged |
| 33 | +pull requests and reviews. A core maintainer then decides, using the decision process below. |
| 34 | +The bar is a guide. A core maintainer can accept someone earlier when their work makes the case, |
| 35 | +and should say why on the issue. |
| 36 | + |
| 37 | +When the role is granted, the person is added to [MAINTAINERS.md](MAINTAINERS.md) and given write |
| 38 | +access to the repository. Branch protection still applies to them like everyone else. |
| 39 | + |
| 40 | +### Publish rights |
| 41 | + |
| 42 | +Each port publishes to its own registry: npm for TypeScript and the web client, Maven Central |
| 43 | +for Java and Kotlin, NuGet for C#, PyPI for Python. Publish rights are granted separately from |
| 44 | +merge rights, because a published version cannot be taken back. |
| 45 | + |
| 46 | +A port maintainer is added as an owner of their port's registry packages when: |
| 47 | + |
| 48 | +- they have been a port maintainer for at least one release of that port, |
| 49 | +- their registry account has two-factor authentication turned on, and |
| 50 | +- they have walked through [docs/RELEASING.md](docs/RELEASING.md) for that registry with a core |
| 51 | + maintainer. |
| 52 | + |
| 53 | +Publish rights cover the packages of that port only. A port maintainer publishes as part of a |
| 54 | +release the core maintainers have approved (see "Releases" below). The registry owners for each |
| 55 | +package are listed in [MAINTAINERS.md](MAINTAINERS.md), and that list is updated in the same |
| 56 | +change that grants or removes access. |
| 57 | + |
| 58 | +### Becoming a core maintainer |
| 59 | + |
| 60 | +A port maintainer can become a core maintainer after at least 6 months in that role, by |
| 61 | +invitation from the existing core maintainers. All existing core maintainers must agree. |
| 62 | + |
| 63 | +## How decisions are made |
| 64 | + |
| 65 | +### Lazy consensus |
| 66 | + |
| 67 | +Most decisions are made by lazy consensus. A proposal is made in public, as an issue, a pull |
| 68 | +request or a discussion. If no maintainer of the affected area objects within the waiting period, |
| 69 | +it is accepted. |
| 70 | + |
| 71 | +- A pull request inside one area can merge once a maintainer of that area approves it and the |
| 72 | + required checks pass. There is no fixed waiting period for these. |
| 73 | +- A change that touches more than one area waits at least 3 days after it is ready for review, |
| 74 | + so the maintainers of each area can look at it. |
| 75 | +- A maintainer does not approve their own pull request. Another maintainer of the area, or a |
| 76 | + core maintainer, reviews it. While the project has a single maintainer, that maintainer merges |
| 77 | + their own changes; this rule applies to an area once it has a second maintainer. |
| 78 | +- An objection must give a reason and, where possible, say what would resolve it. An objection |
| 79 | + without a reason does not block. |
| 80 | + |
| 81 | +If the people involved cannot agree, the core maintainers decide by majority. If the core |
| 82 | +maintainers are split evenly, the creator breaks the tie only on the model format, ADRs and |
| 83 | +releases (see below). On any other subject, an even split leaves the proposal unaccepted and the |
| 84 | +status quo stands. |
| 85 | + |
| 86 | +### Changes that need a core maintainer |
| 87 | + |
| 88 | +These changes need explicit approval from a core maintainer, even when they sit inside one |
| 89 | +area: |
| 90 | + |
| 91 | +- **The model format.** Metamodel types, subtypes and attributes; the canonical serialized form; |
| 92 | + `expected-registry.json` and `metamodelVersion`; and the shared conformance corpora under |
| 93 | + [`fixtures/`](fixtures/). These are the contract every port has to match. |
| 94 | +- **ADRs.** A new or amended decision record under [`spec/decisions/`](spec/decisions/). |
| 95 | +- **The [compatibility policy](docs/compatibility-policy.md).** |
| 96 | +- **Releases**, described next. |
| 97 | +- **This file.** |
| 98 | + |
| 99 | +### Releases |
| 100 | + |
| 101 | +The core maintainers decide when a release happens, what version it carries, and what goes in |
| 102 | +it. The procedure is [docs/RELEASING.md](docs/RELEASING.md). Port maintainers with publish rights |
| 103 | +run the publish for their port inside that decision. They do not publish a version the core |
| 104 | +maintainers have not approved. |
| 105 | + |
| 106 | +### The creator's tie-break and veto |
| 107 | + |
| 108 | +The creator, Doug Mealing, has two extra powers, limited to three subjects: the model format, |
| 109 | +ADRs and releases. |
| 110 | + |
| 111 | +- **Tie-break.** When the core maintainers are split evenly on one of these subjects, the |
| 112 | + creator decides. |
| 113 | +- **Veto.** The creator can block a change to one of these subjects. A veto is written on the |
| 114 | + issue or pull request with the reason. |
| 115 | + |
| 116 | +Outside those three subjects, the creator has one vote like any other core maintainer. |
| 117 | + |
| 118 | +## Ownership |
| 119 | + |
| 120 | +The `metaobjectsdev` GitHub organization, the package namespaces (`@metaobjectsdev` on npm, |
| 121 | +`com.metaobjects` on Maven Central, `metaobjects` on PyPI, and the `MetaObjects` packages on |
| 122 | +NuGet), the `metaobjects.dev` and `metaobjects.com` domains, and the MetaObjects name and |
| 123 | +trademark belong to Doug Mealing LLC. Roles in this file grant access to these. They do not |
| 124 | +transfer ownership. |
| 125 | + |
| 126 | +The code is licensed under the [Apache License 2.0](LICENSE). Contributors keep the copyright to |
| 127 | +their contributions and license them to the project under that license. There is no copyright |
| 128 | +assignment and no contributor license agreement. Anyone may fork the code under the license; the |
| 129 | +license does not grant use of the MetaObjects name or trademark. |
| 130 | + |
| 131 | +Paid work or sponsorship does not grant a role, a vote or an exception to review. A change built |
| 132 | +for a paying customer goes through the same review as any other change. |
| 133 | + |
| 134 | +## Succession |
| 135 | + |
| 136 | +The creator has stepped away when they say so in writing, or when they have not committed, |
| 137 | +reviewed or answered on the project for 6 months. |
| 138 | + |
| 139 | +When that happens: |
| 140 | + |
| 141 | +1. The remaining core maintainers run the project and decide by majority vote. The creator's |
| 142 | + tie-break does not pass to anyone, so an even split leaves the proposal unaccepted and the |
| 143 | + status quo stands. |
| 144 | +2. Doug Mealing LLC gives the remaining core maintainers admin access to the GitHub organization |
| 145 | + and owner access to every registry package, so that releases can continue. |
| 146 | +3. If there is no other core maintainer, the port maintainers choose one or more of themselves as |
| 147 | + core maintainers by majority vote, and step 2 applies to them. |
| 148 | +4. If there are no maintainers at all, the README is updated to say the project is unmaintained. |
| 149 | + The code stays available under the Apache License 2.0. |
| 150 | + |
| 151 | +Ownership of the organization, the namespaces and the trademark stays with Doug Mealing LLC |
| 152 | +throughout. The creator's veto does not pass to anyone. |
| 153 | + |
| 154 | +## Stepping down and removal |
| 155 | + |
| 156 | +### Stepping down |
| 157 | + |
| 158 | +Any maintainer can step down at any time by opening a pull request that moves them to the |
| 159 | +Emeritus section of [MAINTAINERS.md](MAINTAINERS.md). Their write access and registry ownership |
| 160 | +are removed within one week. |
| 161 | + |
| 162 | +### Inactivity |
| 163 | + |
| 164 | +A maintainer who has not reviewed, merged or committed in their area for 6 months is asked |
| 165 | +whether they want to stay. If they do not answer within one month, they move to Emeritus. They |
| 166 | +can come back by asking; a core maintainer restores the role unless there is a reason not to. |
| 167 | + |
| 168 | +### Removal |
| 169 | + |
| 170 | +A maintainer can be removed for a breach of the [Code of Conduct](CODE_OF_CONDUCT.md), or for |
| 171 | +misusing their rights, such as publishing a version outside an approved release or merging a |
| 172 | +model-format change without core-maintainer approval. The core maintainers decide by majority, |
| 173 | +not counting the person concerned. The person is told the reason directly, and the change to |
| 174 | +[MAINTAINERS.md](MAINTAINERS.md) is made in a pull request. |
| 175 | + |
| 176 | +If a registry account or repository access may be compromised, any core maintainer can suspend |
| 177 | +that access at once. The decision on whether to restore it is made within two weeks. |
| 178 | + |
| 179 | +## Changing this file |
| 180 | + |
| 181 | +Changes to this file go through a pull request, stay open for at least 2 weeks, and need |
| 182 | +approval from every core maintainer. The Ownership section can change only with Doug Mealing |
| 183 | +LLC's agreement. |
| 184 | + |
| 185 | +## Related files |
| 186 | + |
| 187 | +- [MAINTAINERS.md](MAINTAINERS.md): who holds each role and each registry package today |
| 188 | +- [CONTRIBUTING.md](CONTRIBUTING.md): how to propose a change |
| 189 | +- [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) |
| 190 | +- [SECURITY.md](SECURITY.md): how to report a vulnerability |
0 commit comments