mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
Adds a public set of rules for the External Maintainer role: who qualifies, how nominations work, what permissions Maintainers gain, what's expected of them, and how step-down works. The Core Team's individual roster is intentionally not enumerated. What's public is the rules everyone plays by. - New file: MAINTAINERS.md (English authoritative version) + 5 locale variants matching the existing CONTRIBUTING.md i18n surface (de, fr, ja-JP, pt-BR, zh-CN). Non-EN/non-zh-CN variants are machine-translated drafts marked at the top — native-speaker review is welcome via follow-up PRs. - CONTRIBUTING.md (and its 5 locale variants): adds a short Becoming a Maintainer section that points at MAINTAINERS.md, so the rules live in one place and translation drift is bounded. Decisions not in this PR (intentional): - No internal Core Team roster. - No internal observability dashboards. - No nomination PR / public voting flow (Core-Team-consensus-driven for now; to be revisited once External Maintainers exceed 5). Co-authored-by: Joey Li <lijinwei@open-design.ai>
243 lines
9.7 KiB
Markdown
243 lines
9.7 KiB
Markdown
# Maintainers
|
|
|
|
<p align="center"><b>English</b> · <a href="MAINTAINERS.pt-BR.md">Português (Brasil)</a> · <a href="MAINTAINERS.de.md">Deutsch</a> · <a href="MAINTAINERS.fr.md">Français</a> · <a href="MAINTAINERS.zh-CN.md">简体中文</a> · <a href="MAINTAINERS.ja-JP.md">日本語</a></p>
|
|
|
|
This document defines the rules for becoming, serving as, and stepping down from
|
|
a Maintainer of `nexu-io/open-design`. The Core Team's individual roster is
|
|
maintained internally and is not enumerated here — what matters publicly are
|
|
the rules everyone plays by.
|
|
|
|
> **Status**: v1, drafted 2026-05-11. Companion to [`CONTRIBUTING.md`](CONTRIBUTING.md#becoming-a-maintainer) — that file points contributors here for the full rules.
|
|
|
|
---
|
|
|
|
## Roles
|
|
|
|
| Role | Permissions |
|
|
|---|---|
|
|
| **Contributor** | Anyone with at least 1 merged PR. No special permissions. |
|
|
| **External Maintainer** | A community contributor promoted under the rules below. Can review, approve, close/reopen issues, and self-assign issues. **Cannot click the merge button** — that stays with the Core Team. |
|
|
| **Core Team** | Open Design's internal team. Holds full repository write access and is the final authority on governance decisions. Roster maintained internally. |
|
|
|
|
The rest of this document is about **External Maintainers** unless stated otherwise.
|
|
|
|
---
|
|
|
|
## What a Maintainer can do that a Contributor cannot
|
|
|
|
| Action | Contributor | Maintainer |
|
|
|---|:---:|:---:|
|
|
| Approve a PR | ⚠️ counts as a comment, **not** as the required approval | ✓ counts as the required approval for merge |
|
|
| Close / reopen issues | Only issues they opened themselves | ✓ any issue |
|
|
| Self-assign open, unassigned issues (P0 first) | ✗ | ✓ |
|
|
|
|
### Merge requirements
|
|
|
|
Any PR — regardless of who authored it — needs **all three** of:
|
|
|
|
1. No code conflicts.
|
|
2. CI fully green.
|
|
3. At least one approval from a Maintainer or Core Team member.
|
|
|
|
A Maintainer's approval is the path most PRs take to merge — it's the most direct way a Maintainer's trust shows up in the project's day-to-day.
|
|
|
|
---
|
|
|
|
## How to become a Maintainer
|
|
|
|
There are **three** entry criteria. All three must be met.
|
|
|
|
### 1. Contribution volume
|
|
|
|
- **≥ 20 merged PRs** to `nexu-io/open-design`.
|
|
|
|
This is a soft floor, not an automatic ticket. Hitting 20 PRs gets you into
|
|
consideration; it does not guarantee the role.
|
|
|
|
### 2. Account quality (anti-sock-puppet, anti-bot)
|
|
|
|
We check the candidate's GitHub profile against seven dimensions. **Pass at
|
|
least 5 of 7 admission lines, and trigger zero veto lines.**
|
|
|
|
| # | Dimension | Admission line | Veto line |
|
|
|---|---|---|---|
|
|
| 1 | GitHub account age | ≥ 1 year | < 90 days |
|
|
| 2 | Public repos | ≥ 3 | 0 |
|
|
| 3 | Followers | ≥ 10 | < 3 |
|
|
| 4 | Followers / following ratio | > 0.30 | < 0.05 (typical follow-farm pattern) |
|
|
| 5 | Profile completeness | Custom avatar **and** at least one of bio / company / blog / twitter | Default avatar **and** all of bio/company/blog empty |
|
|
| 6 | Cross-project activity | At least one merged PR or sustained issue/star activity in **another** public repo | Merged PRs only in this repo |
|
|
| 7 | Account standing | No GitHub platform restrictions (spam/banned/restored) | Any of the above |
|
|
|
|
#### Early-project waiver (auto-expires when repo turns 6 months old)
|
|
|
|
While `nexu-io/open-design` is younger than six months from initial commit,
|
|
the **cross-project activity** veto (#6) may be waived by Core Team consensus
|
|
when:
|
|
|
|
- Dimensions 1, 2, 3, and 5 are clearly above the admission line; **and**
|
|
- The candidate's PR quality in this repo is judged high by the Core Team's
|
|
hands-on review.
|
|
|
|
A waiver must be noted in the Core Team's internal record alongside the
|
|
candidate's name and the date. After the repo reaches six months old, this
|
|
waiver clause is no longer available.
|
|
|
|
### 3. Contribution quality (Core Team judgment)
|
|
|
|
This is qualitative and not formula-based. The Core Team looks at:
|
|
|
|
- **Code quality** of merged PRs (correctness, scope discipline, repo-boundary respect).
|
|
- **Review quality** of any review comments left on others' PRs.
|
|
- **Community participation** — Discussions, issue triage, Discord engagement.
|
|
- **Collaboration signal** — responsiveness to feedback, willingness to revise.
|
|
|
|
Passing the first two criteria gets you into the candidate pool. Crossing
|
|
this third threshold is what gets you nominated.
|
|
|
|
### Selection process
|
|
|
|
1. A Core Team member raises the candidate internally.
|
|
2. The Core Team reaches consensus.
|
|
3. A Core Team member privately reaches out to confirm the candidate is willing.
|
|
4. Onboarding.
|
|
5. Public announcement.
|
|
|
|
There is no nomination PR, no public voting, no fixed term. The intent is
|
|
the **inverse of the K8s/Apache approver-vote model** — early in the
|
|
project's life, lightweight Core Team consensus moves faster and produces
|
|
the same quality of outcome. As the Maintainer cohort grows past five
|
|
External Maintainers, this section will be revisited.
|
|
|
|
---
|
|
|
|
## Responsibilities and expectations
|
|
|
|
**There are no hard quotas.** No weekly PR-review count, no minimum
|
|
issue-triage rate, no SLA for response time. Maintainership is recognition
|
|
of trust, not an unpaid job.
|
|
|
|
What we ask, in spirit:
|
|
|
|
- Approve PRs you have the context for; abstain when you don't.
|
|
- Honor the merge requirements (§ "Merge requirements") — your approval
|
|
is a real signal, not a rubber stamp.
|
|
- Keep `#maintainers` informed if you're going dark for an extended period.
|
|
- Treat the not-yet-public roadmap shared in `#maintainers` as confidential.
|
|
|
|
If the Core Team observes a pattern of bad-case behavior (rubber-stamp
|
|
approvals, malicious issue closures, leaking unannounced roadmap, etc.),
|
|
permissions are revoked under § "Step-down — for cause".
|
|
|
|
---
|
|
|
|
## Maintainer-only access
|
|
|
|
Beyond the repository permissions listed above, Maintainers receive a few
|
|
things the wider community does not:
|
|
|
|
- **Discord `#maintainers` channel** — a private working space shared with
|
|
the Core Team. Used for design previews, RFC drafts, and internal
|
|
coordination on the not-yet-public part of the roadmap.
|
|
- **Confidential roadmap** — early visibility into work that has not yet
|
|
been announced. Maintainers agree to treat its contents as confidential
|
|
until a Core Team member announces them publicly.
|
|
- **Direct line to the Core Team** — your `#maintainers` messages get a
|
|
faster, more substantive response than public Discussions, and the Core
|
|
Team genuinely solicits Maintainer input on architectural and roadmap
|
|
decisions.
|
|
- **Maintainer badge** — a public mark of trust on your GitHub profile and
|
|
in MAINTAINERS-related repo surfaces (rolling out once the GitHub badge
|
|
capability is in place).
|
|
- **Public recognition at promotion** — announcement across Twitter,
|
|
GitHub Discussions, and Discord when you join.
|
|
|
|
---
|
|
|
|
## Step-down
|
|
|
|
Maintainership is not a lifetime appointment. There are three exit paths.
|
|
|
|
### Graceful step-down (voluntary)
|
|
|
|
- The Maintainer messages the Core Team or posts in `#maintainers`.
|
|
- Permissions are revoked within 24 hours.
|
|
- The Maintainer transitions to **Emeritus** status.
|
|
- No public reason is required.
|
|
|
|
### Inactive transition
|
|
|
|
A Maintainer is considered for inactive transition when **any** of:
|
|
|
|
- 90 consecutive days with no activity signal (merged PR, review comment,
|
|
issue triage, substantial Discussion or Discord participation), **or**
|
|
- 60 consecutive days without responding to any @-mention (PR review
|
|
request, issue assignment).
|
|
|
|
Process:
|
|
|
|
1. The Core Team @-mentions the Maintainer privately in `#maintainers`,
|
|
giving a **14-day response window**.
|
|
2. If no substantive response within 14 days, the Maintainer transitions
|
|
to Emeritus and permissions are revoked.
|
|
3. A short, kind public note is posted in GitHub Discussions: "Thanks for
|
|
your contributions — you've been moved to Emeritus, you're welcome
|
|
back any time."
|
|
4. Returning is easy — see "Emeritus" below.
|
|
|
|
### Step-down for cause
|
|
|
|
Triggered by:
|
|
|
|
- Repeated bad-case behavior (e.g., rubber-stamp approvals on
|
|
substandard PRs, malicious issue closures, abuse of permissions).
|
|
- Violation of the project's [Code of Conduct][coc].
|
|
- Security-grade incidents (compromised account not promptly reported,
|
|
intentional leak of unannounced roadmap, etc.).
|
|
|
|
Process:
|
|
|
|
1. Any Core Team member can open the discussion.
|
|
2. **At least 3 Core Team members** must agree before action is taken
|
|
(full Core Team consensus is not required).
|
|
3. Within 24 hours of the decision: permissions revoked, removed from
|
|
`#maintainers`, removed from any Maintainer roster (does **not**
|
|
transition to Emeritus).
|
|
4. The affected person is informed of the decision and reasons, and may
|
|
appeal once.
|
|
|
|
The principle is **bias toward keeping the Maintainer**. A single small
|
|
lapse is not grounds for forced step-down; the for-cause path is for
|
|
repeated patterns or severe one-off incidents only.
|
|
|
|
[coc]: https://www.contributor-covenant.org/
|
|
|
|
---
|
|
|
|
## Emeritus
|
|
|
|
Maintainers who step down gracefully or transition through inactivity become
|
|
**Emeritus**. Emeritus status:
|
|
|
|
- Removes write/approve/close permissions.
|
|
- Keeps the person's name acknowledged on the (internal) roster's Emeritus
|
|
section.
|
|
- Keeps Discord `#maintainers` access (read or post — Maintainer's choice).
|
|
- Carries no ongoing responsibility.
|
|
|
|
### Returning from Emeritus
|
|
|
|
The simplest return path: 3 merged PRs in the most recent 30 days, then
|
|
the Core Team restores permissions. No re-nomination is required.
|
|
|
|
The point of Emeritus is to acknowledge that life happens — a sabbatical,
|
|
a job change, a kid — without any drama or social cost on either side.
|
|
|
|
---
|
|
|
|
## Changes to this document
|
|
|
|
The rules in this document are amendable by Core Team consensus. Material
|
|
changes (admission criteria, step-down thresholds) will be announced in
|
|
GitHub Discussions before taking effect for any active candidate. Editorial
|
|
clarifications can land directly.
|