agentleFS
Sign inSign up

update-gvisor-maintainers

google/gvisor/.agents/skills/update-gvisor-maintainers/SKILL.md

Update the gVisor maintainer roster in governance/maintainers.yaml or the specialization areas in governance/areas.yaml, and regenerate the files derived from them (.github/reviewer.json, MAINTAINERS.md and CODEOWNERS). Use when a maintainer goes on hiatus, returns from hiatus, is added, steps down to emeritus, changes employer or specialization, or when MAINTAINERS.md / reviewer.json / CODEOWNERS are out of sync.

Skill19k starsChanged 34 days ago
---
name: update-gvisor-maintainers
description: >
  Update the gVisor maintainer roster in governance/maintainers.yaml or the
  specialization areas in governance/areas.yaml, and regenerate the files derived
  from them (.github/reviewer.json, MAINTAINERS.md and CODEOWNERS).
  Use when a maintainer goes on hiatus, returns from hiatus, is added, steps down to
  emeritus, changes employer or specialization, or when MAINTAINERS.md /
  reviewer.json / CODEOWNERS are out of sync.
---

# Update the gVisor maintainer roster

`governance/maintainers.yaml` (the roster) and `governance/areas.yaml`
(specialization areas, each mapping a name to repository paths) are the single
source of truth. `.github/reviewer.json`, `MAINTAINERS.md` and `CODEOWNERS` are
generated from them by `//governance/tools/maintainers:maintainers_gen`, and the
`make governance-check` CI step byte-compares all three against the checked-in
copies. So: edit the YAML, regenerate, run the check. Never hand-edit the
generated files; the check will catch you, and rightly so.

## Schema

Each entry under `maintainers:`:

```yaml
  - name: Gee Vaïzaur           # Full name or nickname.
    github: gvaizaur            # GitHub username.
    affiliation: Independent    # Current employer, or "Independent".
    past_affiliation:           # Optional.
      - affiliation: Arasaka Corporation
        until: 2025-03-01
    started: 2018-05-08         # First contribution. The list is sorted by this.
    status: HIATUS_SINCE:2026-07-17
    areas: [gpu, networking]    # Optional. Sorted area names from areas.yaml;
                                # grants CODEOWNERS ownership of the paths of
                                # areas with enforced_review. Not for emeritus.
```

Each entry under `areas:` in `areas.yaml`:

```yaml
  - name: gpu                   # Sorted by name.
    enforced_review: false      # Required. `true` generates a CODEOWNERS
                                # section for the area, making
                                # specialized-maintainer review mandatory.
                                # Needs at least one non-emeritus maintainer
                                # with the area.
    paths:                      # Repo-root-relative dirs (/like/this), no
      - /images/gpu             # trailing slash. Each path in one area only.
```

`status` is one of three, and it drives everything downstream:

Status                      | Reviews | Merge permissions | `reviewer.json` | `MAINTAINERS.md`
--------------------------- | ------- | ----------------- | --------------- | ----------------
`ACTIVE`                    | yes     | yes               | `true`          | main table
`HIATUS_SINCE:YYYY-MM-DD`   | no      | yes               | `false`         | main table
`EMERITUS_SINCE:YYYY-MM-DD` | no      | no                | omitted         | emeritus table

`true` in `reviewer.json` means the GitHub workflow may auto-assign reviews to
them. `false` means they are still a maintainer, just not on the receiving end
of the assignment lottery. Hiatus is about reviews only, not permissions; that
is why hiatus maintainers still show up in the main `MAINTAINERS.md` table
alongside active ones.

## Common changes

Most of these are a one-line `status:` edit on an existing entry:

-   Goes on hiatus: `status: HIATUS_SINCE:<today>`.
-   Comes back from hiatus: `status: ACTIVE`. Drop the date; `ACTIVE` never
    carries one.
-   Steps down, or hits 12 months of inactivity: `status:
    EMERITUS_SINCE:<date>`.
-   Comes back from emeritus: `status: ACTIVE`, but only through the normal
    nomination process. See "Becoming a maintainer" in `GOVERNANCE.md`.

The two that are not:

-   New maintainer: insert the entry in `started` order, not at the end of the
    file.
-   Changed employer: update `affiliation`, and move the old one to
    `past_affiliation` with the date it ended as `until`.

Dates are real calendar dates, so go look up today's date rather than guessing
at one. If the user gave you a date, use theirs.

After any change, regenerate.

## Regenerate

```bash
make governance-regen
```

This regenerates all three files in place.

Then:

```bash
make governance-check
```

This fails if the YAML changed and you forgot to regenerate, or if someone
edited a generated file by hand.

## Before handing back

Show the user the diff across all changed files (`governance/maintainers.yaml`,
`governance/areas.yaml`, `.github/reviewer.json`, `MAINTAINERS.md`,
`CODEOWNERS`) and let them confirm the roster reads the way they meant it to.

If a generated file contains something the generator does not emit, that content
is drift, and regenerating is what removes it. Do not teach the generator to
reproduce it without asking first: the generator decides what those files
contain, not whatever happened to be committed.

Discussion

Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.

Posts are public.Sign in to post

No one has posted yet. Be the first.