Research digest: governance file audit — 2026-05-30¶
ADR: ADR-0901. PR: chore/governance-audit (this PR).
1. Scope of the audit¶
Inventory the eight conventional community-health and project- governance artifacts and classify each as present-and-current, present-but-stale, or missing.
| File | Pre-audit state | Action |
|---|---|---|
.github/CODEOWNERS | Present; missing fork subtrees | Added 13 new owner rows |
CONTRIBUTING.md | Present; missing 4 sections | Added branch naming, ADR-0108, ADR allocator, governance pointer |
SECURITY.md | Present; current | No change |
CODE_OF_CONDUCT.md | Present; Contributor Covenant v2.1 | No change |
.github/PULL_REQUEST_TEMPLATE.md | Present; ADR-0108 checklist already in place | No change |
.github/ISSUE_TEMPLATE/*.yml | Present (bug, feature, perf, config) | No change |
GOVERNANCE.md | Missing | Added |
MAINTAINERS.md | Missing | Added |
2. Why the additions matter¶
GitHub's community-health UI surfaces a checklist of these eight files on every repo. Two were red (GOVERNANCE.md, MAINTAINERS.md). Beyond the cosmetic signal, a missing GOVERNANCE.md means an external contributor or a prospective maintainer has no documented answer for:
- Who decides what?
- How are decisions captured (ADRs vs. issues vs. discussions)?
- How do you become a maintainer?
And a missing MAINTAINERS.md means the bus-factor surprise hits at the worst possible time (a security advisory, a long-lived contributor wanting to share load) instead of being on the table.
3. CODEOWNERS gap analysis¶
The pre-audit CODEOWNERS file covered:
- The upstream-mirror C subtrees under
/libvmaf/...(in-flight rename to/core/...per ADR-0700, being done in PR #321). - Public C API headers and CLI under
/libvmaf/include/,/libvmaf/tools/. - Build system root files.
- CI / supply chain (
.github/workflows/,.github/dependabot.yml,release-please-config.json,.release-please-manifest.json). - The Claude agent surface (
.claude/,CLAUDE.md,AGENTS.md). - Netflix golden-data test files (with a "never modify" marker).
Subtrees added since the original CODEOWNERS authoring that were NOT covered until this PR:
| Subtree | Phase / ADR | Why it needs an owner row |
|---|---|---|
/ai/ | Phase 3k | Tiny-AI model training; touches DNN gate |
/core/src/dnn/ | Phase 3k | ONNX Runtime integration |
/model/ | always | Shipped VMAF models |
/mcp-server/ | Phase 3 | JSON-RPC tool surface |
/cmd/ | Phase 4b | Controller / node / operator / server / tune (ADR-0709) |
/deploy/ | Phase 3 | Helm chart (ADR-0699) |
/docker/ | Phase 3 | Production Dockerfile (ADR-0698) |
/dev/ | Phase 3 | Dev container (vmaf-dev-mcp) |
/compat/ | ADR-0700 | Post-rename Python harness location |
/ffmpeg-patches/ | ADR-0186 | FFmpeg integration patches against n8.1 |
/scripts/ | always | Build / release / ADR scripts |
/tools/ | always | Repository tooling |
/docs/adr/ | always | ADRs are the fork's decision audit trail |
/changelog.d/ | ADR-0221 | Changelog fragment tree |
The catch-all * @Lusoris rule already routed reviews for all of these — the per-subtree rows are about giving each subtree a named slot so future maintainer additions are mechanical (replace @Lusoris with the new handle on the relevant row).
4. Coordination with PR #321¶
PR #321 (fix(config): update IDE and lint configs for ADR-0700 libvmaf/ → core/ rename) rewrites every existing /libvmaf/... row in CODEOWNERS to its /core/... equivalent. This PR is append-only for CODEOWNERS — every new row sits below the existing rows, so there is no line-level conflict with #321. If
321 lands first, this PR's additions apply cleanly on top. If¶
this PR lands first, #321 rebases by re-running its rename pass against the new file and the additions ride along unchanged.
Verified by reading gh pr view 321 --json files before drafting: PR #321's diff for .github/CODEOWNERS is +12 / -12, all rename-only on the existing rows. No new rows are added by #321.
5. CONTRIBUTING.md gap analysis¶
The pre-audit file covered: quickstart, core rules (Conventional Commits, principles, golden-data gate, cross-backend correctness, license headers, no force-push), reporting bugs / requesting features, review expectations, upstream sync, and the inherited Netflix upstream algorithmic contribution guide.
Gaps surfaced by reading a first-time contributor through the file:
- Branch naming — Conventional Commits is mentioned for commit messages but the branch-prefix convention (
feat/<slug>,fix/<slug>, ...) is undocumented. New contributors guess. - ADR-0108 deliverables — the file does not mention the six-deliverables gate; the contributor only sees it when the PR is rejected by the CI parser.
- ADR allocator —
scripts/adr/next-free.sh --claimis documented inCLAUDE.md§12 r8 and in ADR-0535 / ADR-0628, but not in the file external contributors actually read. - Governance — no pointer to
GOVERNANCE.mdorMAINTAINERS.md.
All four gaps are now closed in the same section block.
6. What this audit did NOT change¶
SECURITY.md— content was already comprehensive: supported versions, private disclosure channel, alternative email + PGP request, response timeline, supply-chain guarantees (SBOM, Sigstore, SLSA L3), known non-vulnerabilities. No drift.CODE_OF_CONDUCT.md— Contributor Covenant v2.1 with the enforcement email pointing atlusoris@pm.me. No drift..github/PULL_REQUEST_TEMPLATE.md— already carries the ADR-0108 checklist with the strict sentinel forms required by the parser. No drift..github/ISSUE_TEMPLATE/{bug_report,feature_request,performance_regression,config}.yml— bug template covers backend selection (CPU/AVX2/AVX-512/NEON/ CUDA/SYCL/HIP), version+OS+hardware, logs, and the Netflix golden checkbox. Feature template covers scope dropdown. Performance template requires bisect output, before/after numbers, hardware. Config file routes security to private flow and points at upstream Netflix for upstream-only issues. No drift.- The existing CODEOWNERS rows (still using
/libvmaf/...) — deferred to PR #321 to avoid merge-conflict on rename.
7. Reproducer¶
# Before this PR — community-health check finds missing files:
test -f GOVERNANCE.md || echo "MISSING: GOVERNANCE.md"
test -f MAINTAINERS.md || echo "MISSING: MAINTAINERS.md"
grep -q "Deep-dive deliverables" CONTRIBUTING.md || echo "MISSING: ADR-0108 in CONTRIBUTING.md"
grep -q "^/ai/" .github/CODEOWNERS || echo "MISSING: /ai/ owner row"
# After this PR — all four checks silent.
References¶
- ADR-0901 (this PR's ADR).
- Concurrent: PR #321 — CODEOWNERS path rewrite for ADR-0700.
- ADR-0108 — Deep-dive deliverables.
- ADR-0700 — VMAFX repo layout.