mirror of
https://github.com/ModernRelay/omnigraph.git
synced 2026-06-15 01:55:13 +02:00
107 lines
6 KiB
Markdown
107 lines
6 KiB
Markdown
|
|
# Governance
|
||
|
|
|
||
|
|
This document describes how **external contributions** to OmniGraph are
|
||
|
|
proposed, accepted, and merged. It exists so an outside contributor can answer,
|
||
|
|
without asking: *where does my report/idea/change go, who decides, and what has
|
||
|
|
to happen before code lands?*
|
||
|
|
|
||
|
|
> **Scope.** This governs the public contribution surface — Issues,
|
||
|
|
> Discussions, RFCs, and pull requests from people outside the ModernRelay
|
||
|
|
> team. **Maintainers operate under a separate internal process** and are not
|
||
|
|
> bound by the intake gates below. Everyone, maintainer or not, is still bound
|
||
|
|
> by the universal gates: branch protection on `main` and CODEOWNERS review
|
||
|
|
> (see [docs/dev/branch-protection.md](docs/dev/branch-protection.md) and
|
||
|
|
> [docs/dev/codeowners.md](docs/dev/codeowners.md)).
|
||
|
|
|
||
|
|
## Roles
|
||
|
|
|
||
|
|
| Role | Who | Authority |
|
||
|
|
|---|---|---|
|
||
|
|
| **Maintainer** | The code owners in [`.github/CODEOWNERS`](.github/CODEOWNERS) (generated from [`.github/codeowners-roles.yml`](.github/codeowners-roles.yml)) | Validate issues, accept/reject RFCs, review and merge PRs, set direction. Final decision authority. |
|
||
|
|
| **Contributor** | Anyone else | Report problems (Issues), propose ideas (Discussions), author RFCs, and open pull requests. |
|
||
|
|
|
||
|
|
Decision authority rests with the maintainers. CODEOWNERS is the single source
|
||
|
|
of truth for who that is; this document does not duplicate the list.
|
||
|
|
|
||
|
|
## The three channels
|
||
|
|
|
||
|
|
Each channel has one job. Using the right one is the first thing we ask of a
|
||
|
|
contribution.
|
||
|
|
|
||
|
|
| Channel | Purpose | Not for |
|
||
|
|
|---|---|---|
|
||
|
|
| **[Issues](../../issues)** | **Report a problem** — a bug, a regression, a documented behavior that's wrong. Something concrete and reproducible. | Feature requests, ideas, questions, or design proposals (→ Discussions). |
|
||
|
|
| **[Discussions](../../discussions)** | **Propose and explore** — new ideas, feature requests, questions, and the incubation of RFCs. | Bug reports (→ Issues). |
|
||
|
|
| **Pull requests** | **Land a sanctioned change** — a fix for a *validated* issue, an *accepted* RFC, or a trivial change (see fast-lane). | Substantive change with no backing issue/RFC — it will be redirected. |
|
||
|
|
|
||
|
|
## How a change becomes mergeable
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────── bug ───────────┐ ┌──────── idea / feature ────────┐
|
||
|
|
▼ │ ▼ │
|
||
|
|
Issue (problem report) │ Discussion (idea / RFC incubation) │
|
||
|
|
│ │ │ │
|
||
|
|
maintainer triage │ rough consensus │
|
||
|
|
│ │ │ graduate │
|
||
|
|
▼ │ ▼ │
|
||
|
|
label: accepted ──────────┐ │ RFC PR (docs/rfcs/NNNN-*.md) │
|
||
|
|
│ │ │ │ │
|
||
|
|
│ │ │ maintainer review │
|
||
|
|
▼ ▼ │ ▼ │
|
||
|
|
Pull request ◀──────────┴──────────│── merged == accepted │
|
||
|
|
(links the issue or the accepted RFC) ◀───────┘ (implementation PRs reference it) │
|
||
|
|
│
|
||
|
|
review + CODEOWNERS + branch protection
|
||
|
|
▼
|
||
|
|
merged
|
||
|
|
```
|
||
|
|
|
||
|
|
### Issues → validated
|
||
|
|
A new issue starts unlabeled. A maintainer triages it and, if it's a real,
|
||
|
|
in-scope problem, applies the **`accepted`** label. **Only `accepted` issues are
|
||
|
|
open for a contributor PR.** This prevents the "I fixed an issue you hadn't
|
||
|
|
agreed was a problem" rejection. Want to fix something? Get the issue accepted
|
||
|
|
first, or pick one already labelled `accepted` / `help wanted`.
|
||
|
|
|
||
|
|
### Discussions → RFCs → accepted
|
||
|
|
Ideas and feature requests start in **Discussions**. Anyone — including external
|
||
|
|
contributors — may then **author an RFC** by opening a pull request that adds
|
||
|
|
`docs/rfcs/NNNN-title.md` (see [docs/rfcs/README.md](docs/rfcs/README.md)). The
|
||
|
|
RFC is reviewed as code; **a maintainer merging it is the act of acceptance**
|
||
|
|
(it becomes the durable decision record). Implementation PRs then reference the
|
||
|
|
accepted RFC.
|
||
|
|
|
||
|
|
Authoring an RFC is open to everyone; **accepting one is a maintainer
|
||
|
|
decision.** Maintainers may also decline an RFC, with rationale, by closing it.
|
||
|
|
|
||
|
|
### Pull requests → sanctioned
|
||
|
|
A contributor PR must do one of:
|
||
|
|
1. link a maintainer-**`accepted`** issue it fixes, or
|
||
|
|
2. be (or reference) an **accepted RFC**, or
|
||
|
|
3. qualify for the **trivial fast-lane**.
|
||
|
|
|
||
|
|
**Trivial fast-lane** — these may be opened directly, no prior issue/RFC:
|
||
|
|
typo and wording fixes, documentation corrections, dependency bumps, comment
|
||
|
|
fixes, and obviously-correct one-line CI tweaks. When in doubt, open an Issue or
|
||
|
|
Discussion first; a PR that turns out to be non-trivial will be asked to.
|
||
|
|
|
||
|
|
A substantive PR with no backing issue/RFC will be closed with a pointer to the
|
||
|
|
right channel — not as a judgment of the idea, but to keep design discussion
|
||
|
|
where it's reviewable.
|
||
|
|
|
||
|
|
## What maintainers do *not* gate
|
||
|
|
Maintainers' own changes do not pass through the intake gates above — the team
|
||
|
|
runs a separate internal process. The universal gates (review, CODEOWNERS,
|
||
|
|
branch protection, CI) apply to everyone. Enforcement of the intake rules is, to
|
||
|
|
start, **by convention and review** (PR template + labels); an automated check
|
||
|
|
keyed to author association may be added later if volume warrants.
|
||
|
|
|
||
|
|
## Code of conduct & security
|
||
|
|
- Conduct: [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
|
||
|
|
- Security issues are **not** public Issues — see [SECURITY.md](SECURITY.md).
|
||
|
|
|
||
|
|
## Changing this document
|
||
|
|
Governance changes the same way code does: a pull request, reviewed by
|
||
|
|
maintainers. This file describes the external surface; the internal maintainer
|
||
|
|
process is intentionally out of scope here.
|