# Maintainer Governance Ambiguity

A failure mode where a project's *who-controls-what* is private and informal — everyone involved in the project knows, no outside observer can tell — and an access-change event suddenly forces outsiders to evaluate it without the information they'd need. From outside, the early stages of a legitimate maintainer dispute and the early stages of a hostile takeover produce the same signals: unexpected release, changed access, conflicting public posts, deleted statements, a fork appearing.

The xz-utils incident reset the baseline. Before that, a new maintainer doing more work than the old one was unremarkable. After, it is the exact pattern of a documented year-long social-engineering attack, and downstream tools and humans now treat it with suspicion. The cost is that legitimate transitions also trip the alarm, repeatedly — which is the right tradeoff for users but a real burden for projects.

## The signals that read as compromise

From the outside, indistinguishable from a real attack:

- Sudden release after a long quiet period
- Maintainer added or removed without public announcement
- Funding / sponsorship file edits committed without discussion
- Public posts about the project later deleted
- A new fork or "alternative implementation" appearing with overlapping name
- Different parties making contradictory factual claims in the same thread

The defender's reading is: "any one of these is fine; the combination is the [[xz-utils-incident|xz pattern]]."

## Why ambiguity is itself the security problem

The 321k-dependent fsnotify incident is the clean example (see [[fsnotify-maintainer-dispute]]): no malicious code, no compromise, no actual attack — and yet Grafana opened a public issue, Kubernetes filed "Healthy or not?" and floated forks, Socket wrote it up. The cost was real: hundreds of hours of downstream-maintainer attention diverted to verifying that nothing was wrong. The information asymmetry between project-internal knowledge ("we hand out commit bits to drive-by contributors, here's why this dispute is just a dispute") and project-external knowledge ("we only see the access-control change in the audit log") is what produces the cost, not any actual change in attack surface.

For a project deep enough in the dependency graph, *governance opacity is a vulnerability*. Not because it allows attacks, but because it forces every downstream user to do the verification work the project's documentation should have done once.

## What reduces the ambiguity

These are not full governance models; they are the minimum-viable artifacts that make access changes auditable from outside without requiring trust in any single statement:

- **`MAINTAINERS.md`** with explicit current-vs-inactive sections, updated as a tracked file. When access changes, the PR that updates this file is the canonical announcement, and its review is the canonical authority statement.
- **Release authority separated from commit access.** Tag signatures bound to specific keys; release workflows that only specific maintainers can dispatch (see [[long-lived-keys]], [[supply-chain-security]] for the underlying mechanisms). Old historical commit bits stop mattering for releases.
- **Sponsorship/funding changes treated as authority statements**, not bookkeeping. A direct-to-main `FUNDING.yml` edit reads as "I am claiming the project's money flow." It should go through PR review like anything else that signals authority.
- **In-repo audit trail for access changes.** GitHub's organization audit log is private to org admins; CODEOWNERS history and MAINTAINERS.md edits are public. Use the public mechanism.

None of these prevent disputes. They shorten the period during which downstream users can't tell takeover from drama.

## Adjacent concepts

- [[supply-chain-security]] — broader category
- [[unmaintained-scanner-pressure]] — the inverse failure mode: scanner heuristics pressure mature projects into the kind of "new maintainer steps in" event that itself looks like a takeover
- [[long-lived-keys]] — the credential side; ephemeral release credentials make "who can publish" structural rather than person-tied
- [[xz-utils-incident]] — reference case
