From a52c2aac294cfaefe556b94d9b748a4ed7820106 Mon Sep 17 00:00:00 2001 From: Steven Crothers Date: Mon, 27 Jul 2026 14:23:58 -0400 Subject: [PATCH] Rewrite CODEOWNERS for the refactored team structure The four previous teams were renamed as part of an org-wide refactor, so every line in this file referenced a slug that no longer resolves: codeowners/errors reported Unknown owner on all five. Two defects are fixed alongside the rename. The catch-all pattern was the last line, and GitHub applies the last matching pattern rather than the most specific one, so it overrode every rule above it and made the three team-specific entries dead. It now leads, and the file is ordered broadest to narrowest with that rule stated at the top. Coverage also grows to the surfaces that had no owner but the catch-all: internal/, cmd/, examples/, .claude/, the module and toolchain files, and the release and security workflows. docs/specifications/ regains a dedicated owner separate from docs prose - it is the wire contract, frozen at the first v* tag, not documentation. --- .github/CODEOWNERS | 76 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 83cbaed..f07d7c1 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,71 @@ -/.github/ @pluggableharness/core-maintainers -/api/ @pluggableharness/core-maintainers @pluggableharness/plugin-maintainers @pluggableharness/sdk-maintainers -/docs/ @pluggableharness/core-maintainers @pluggableharness/documentation-team -/pkg/ @pluggableharness/core-maintainers @pluggableharness/plugin-maintainers @pluggableharness/sdk-maintainers -* @pluggableharness/core-maintainers +# ============================================================================= +# CODEOWNERS +# +# GitHub applies the LAST matching pattern, not the most specific one. This +# file is therefore ordered broadest -> narrowest, and grouping by team is a +# mistake: a top-level pattern written below a nested one silently overrides +# it. Add new entries at the bottom of their tier, never at the end of file. +# +# A team is only a valid owner if it exists, is visible to org members, and +# has write access or better to this repository. Check with: +# gh api repos/pluggableharness/agent/codeowners/errors +# +# Ownership is enforced only while the protect-main ruleset sets +# require_code_owner_review. Without it this file is notification only. +# ============================================================================= + +# Default owner for anything not claimed below. +* @pluggableharness/maintainers + +# --- Tier 1: top-level surfaces --------------------------------------------- +/api/ @pluggableharness/protocol-maintainers +/pkg/ @pluggableharness/sdk-maintainers +/examples/ @pluggableharness/sdk-maintainers +/internal/ @pluggableharness/kernel-maintainers +/cmd/ @pluggableharness/kernel-maintainers +/docs/ @pluggableharness/docs-maintainers +/.github/ @pluggableharness/build-infrastructure +/.claude/ @pluggableharness/maintainers + +# --- Tier 2: narrower than Tier 1, so it must follow it --------------------- +# The wire contract. Frozen at the first v* tag and permanent thereafter for +# every out-of-tree plugin; buf breaking is the machine half of this gate. +/docs/specifications/ @pluggableharness/protocol-maintainers + +# The plugin-author surface. Third parties compile against it. +/docs/first-party/ @pluggableharness/sdk-maintainers + +# The terminal shell: different skill set, and the TTY-ownership constraint +# that follows from a frontend being a go-plugin subprocess. +/docs/first-party/frontends/ @pluggableharness/frontend-maintainers +/pkg/frontend/ @pluggableharness/frontend-maintainers @pluggableharness/sdk-maintainers +/pkg/widget/ @pluggableharness/frontend-maintainers @pluggableharness/sdk-maintainers +/pkg/render/ @pluggableharness/frontend-maintainers @pluggableharness/sdk-maintainers +/internal/tui/ @pluggableharness/frontend-maintainers +/cmd/tui/ @pluggableharness/frontend-maintainers + +# release.yml hands whatever a v* tag points at to GoReleaser. +/.github/workflows/release.yml @pluggableharness/release-engineering +/.github/workflows/codeql.yml @pluggableharness/security-response +/.github/workflows/security.yml @pluggableharness/security-response +/.github/workflows/scorecard.yml @pluggableharness/security-response + +# --- Root files ------------------------------------------------------------- +# Each is anchored with a leading slash: a bare filename pattern would match +# that name at any depth in the tree. +/buf.yaml @pluggableharness/protocol-maintainers +/buf.gen.yaml @pluggableharness/protocol-maintainers +/go.mod @pluggableharness/kernel-maintainers @pluggableharness/build-infrastructure +/go.sum @pluggableharness/kernel-maintainers @pluggableharness/build-infrastructure +/.golangci.yml @pluggableharness/build-infrastructure +/.goreleaser.yaml @pluggableharness/release-engineering +/SECURITY.md @pluggableharness/security-response +/mkdocs.yml @pluggableharness/docs-maintainers +/pyproject.toml @pluggableharness/docs-maintainers +/uv.lock @pluggableharness/docs-maintainers +/.python-version @pluggableharness/docs-maintainers +/README.md @pluggableharness/docs-maintainers +/SUPPORT.md @pluggableharness/docs-maintainers +/CLAUDE.md @pluggableharness/maintainers +/CONTRIBUTING.md @pluggableharness/maintainers +/LICENSE.md @pluggableharness/admins