Skip to content

14 Contributor Promotion

Heinrich Krupp edited this page May 1, 2026 · 1 revision

Contributor Promotion

How CODEOWNERS is decided for mcp-memory-service. This page exists so the process is transparent, predictable, and reviewable — both for the maintainer and for community members wondering how trust is earned here.

TL;DR: Three-plus merged PRs of consistent quality in a focused area earns auto-tag (FYI) ownership of that area. No merge rights granted via CODEOWNERS — this is review-pings, not gatekeeping.


Why this exists

The project has one full-time maintainer (@doobidoo) and a growing pool of contributors. Without a written rule of thumb:

  • Promotion decisions feel arbitrary
  • Contributors don't know how to earn ownership
  • Owners can go inactive without anyone noticing

This page sets the bar and the cadence for keeping CODEOWNERS aligned with reality.


Promotion criteria

A contributor is considered for CODEOWNERS entry when all of the following are true within a focused area (one subsystem, one file, or one closely-related path group):

Signal Bar
Merged PRs ≥3 in that area, over ≥4 weeks
Quality Reproducer-backed, tests included, low rework rate
Self-direction Surfaces issues themselves; doesn't only react to maintainer prompts
Communication Responsive in PR threads; comments are useful, not noise
Scope discipline PRs stay scoped; doesn't smuggle unrelated changes

Areas already mapped (see .github/CODEOWNERS):

Area Owner Why
storage/milvus.py, docs/milvus-backend.md @zc277584121 Built the Milvus backend (PR #721)
storage/milvus_graph.py @henry201605 Owns Milvus graph + BM25 (PRs #762, #775)
tests/storage/test_milvus.py @zc277584121, @henry201605 Joint test ownership
quality/, server/handlers/quality.py, services/memory_service.py, tests/quality/ @filhocf RRF (#773), mistake notes (#786), stale_days (#796), maintain orchestrator (#802)

What CODEOWNERS does (and doesn't) do here

Does: GitHub auto-requests review from the listed owner when a PR touches their path. Owners get a notification ping.

Doesn't: Block merges. Branch protection has require_code_owner_reviews: false — owner approval is informational, never required. Maintainer can still merge without owner review (e.g., when owner is unavailable, or for trivial fixes the owner already pre-approved).

This is intentional. CODEOWNERS = "second pair of eyes nudge", not "gatekeeper".


Demotion criteria

An owner entry is removed (without prejudice) when:

  • No reviews/responses on requested PRs in 90 days, and
  • No commits in their owned area in 90 days

Demotion is not punishment — it keeps notifications useful. Re-promotion follows the same path as the initial criteria.


Validation cadence

CODEOWNERS is reviewed quarterly by an automated routine that:

  1. Pulls the last 90 days of PR/issue activity
  2. Identifies new contributors who cleared the promotion bar
  3. Identifies current owners who went silent
  4. Posts recommendations as a comment on the daily-triage tracking issue (or a dedicated quarterly issue)

The maintainer reviews recommendations and applies (or rejects) them in a single chore(codeowners) PR. No auto-edits.


How to suggest a promotion

You don't need to wait for the quarterly review. Either:

  • Open a Discussion in General with the area you'd like to own, your relevant PR numbers, and a one-line case
  • Or comment on an open PR you authored, mentioning the maintainer

Self-nominations are fine. Nominating someone else is also fine. The maintainer evaluates against the criteria above.


Edge cases

  • Cross-cutting PRs (e.g., touching all storage backends in one sweep): single-PR contributions don't earn ownership — the bar is sustained focus on an area.
  • One-off documentation fixes: appreciated, but no path to ownership unless the contributor returns to the area.
  • Joint ownership (e.g., two people on one path): allowed. GitHub requests review from any one of them.
  • Self-ownership by the maintainer: implicit, not listed. CODEOWNERS only documents external trust assignments.

Related

Clone this wiki locally