← Back to Technical Reference · Home
How GitHub teams work in the IHE org, how the Devices domain uses them, and the exact click-by-click steps for the tasks that aren't obvious in the GitHub UI.
Audience: Domain Leads and team Maintainers. Most of this is done through the GitHub web interface — no command line.
GitHub has two separate ideas that are easy to confuse. Keep them straight and everything else follows.
Every person on a team is either a Member or a Maintainer. This controls what they can do to the team itself — it has nothing to do with repositories.
| Team role | Can do |
|---|---|
| Member | Belong to the team. Inherit whatever repo access the team has. |
| Maintainer | Everything a Member can, plus add/remove people, promote others to Maintainer, edit the team name/description, and manage child teams. |
A "team Maintainer" is what we mean when we say someone manages a team. A team can have more than one Maintainer.
This is the part that is not obvious in the GitHub UI — promoting someone to Maintainer isn't a per-row control; you select the member with a checkbox and use a "change role" action at the top of the list. See §4.
Separately, a team is granted a permission level on each repository it's added to. This controls what the team's members can do to that repo's content.
| Repo permission | Can do |
|---|---|
| Read | View and clone. |
| Triage | Read + manage issues and PRs (no code write). |
| Write | Read + push branches, open/merge PRs (subject to branch protection). |
| Maintain | Write + manage most repo settings — but not delete the repo, change branch protection, or manage access. |
| Admin | Full control, including settings, branch protection, and access. |
The two are independent. Someone can be a plain Member of a team that has Admin on a repo (so they get Admin on the repo but can't manage the team). Or a Maintainer of a team that only has Read (they manage the roster but can only read the code).
Teams can be nested. A child team sits under a parent team, and this is supported on the GitHub Free plan.
The single rule worth memorizing:
Child teams inherit the parent's repository access. Access flows downward, never upward.
So if devices-domain (parent) has Read on a repo, every child team automatically has at least Read on that repo too. But giving a child team Write on some repo does not give the parent team anything.
Membership does not inherit the same way: being a member of the parent team does not automatically add you to a child team's roster. (The parent's members do, however, inherit the child team's repo access through the parent → child access chain only for repos the parent itself is granted.) In practice, treat rosters as independent per team and rely on nesting only for the downward repo-access inheritance.
devices-domain (parent — the whole domain)
├── DEV.SDPi → SDPi maintainer (child, repo permission: Maintain)
│ SDPi writer (child, repo permission: Write)
├── DEV.PCIM → PCIM maintainer (child, Maintain)
│ PCIM writer (child, Write)
└── ... one "maintainer" + "writer" child pair per supplement repo
devices-domainis the umbrella parent team. The Domain Lead is a Maintainer of it.- For each supplement repo, two child teams are created:
{name} writerand{name} maintainer(where{name}is the repo name without theDEV.prefix — e.g.DEV.WIA→ team namesWIA writerandWIA maintainer, which GitHub turns into the URL slugswia-writerandwia-maintainer). dev-co-chairsis granted Admin on every repo (handled by the repo-creation automation), so the co-chairs always have full control regardless of the per-repo teams.
For new repos, the per-repo child teams are created and wired up automatically by the repo-creation workflow. You only do the steps below manually for existing repos, or to fix something up.
The last word of the team name declares the role it is meant to have, and the repo permission must be set to match. Keeping these aligned is what makes the convention trustworthy — the name tells you the access without having to open settings.
| Team name ending | Intended role | Repo permission to assign |
|---|---|---|
… writer |
Contributors / lead authors who edit content | Write |
… maintainer |
People who manage the repo's content workflow | Maintain |
Note: a
… maintainerteam's name refers to the repo permission "Maintain" — do not confuse it with the team role "Maintainer" from §1. A maintainer team can still have plain Members and Maintainers of its own.
When you assign a team to a repo (§6), pick the permission from this table that matches the name. If you ever see a writer team with Admin, or a maintainer team with Read, that's drift — fix it.
This is the task that's hard to find in the UI. To let another person manage a team (add/remove members, promote others), promote them to Maintainer.
You must already be a Maintainer of the team (or an Org Owner) to do this.
- Go to the team page:
github.com/orgs/IHE/teams/{team-name}(e.g.github.com/orgs/IHE/teams/devices-domain) - Click the "Members" tab.
- Find the person in the list and tick the checkbox next to their name.
- You can select more than one person to change several roles at once.
- If you don't see checkboxes, you're not a Maintainer of this team — ask an Org Owner or an existing Maintainer.
- At the top of the members list, open the "change role" dropdown that appears once someone is selected.
- Choose "Maintainer" (or "Change role to maintainer"). The change takes effect immediately — they now manage the team.
If the person isn't on the team yet: add them first ("Add a member" → search username → Add), then follow steps 3–5 to promote them.
To demote: select them the same way → "change role" → "Member".
There's a catch that trips everyone up on our plan:
A person can only be on a team if they are a member of the IHE organization — and on the Free plan, only an Org Owner can invite someone to the organization.
So if you try to add someone who isn't in the IHE org yet, the normal team UI won't let you complete it: you'd first need an Owner to invite them to the org. To get around that bottleneck, we have an automation that does the org invite and the team add in one step, on behalf of co-chairs.
Use this for anyone, whether or not they're already in the IHE org.
- Go to DEV.tooling → New Issue
- Select "Add People to a Team"
- Enter the team name (e.g.
WIA writer,WIA maintainer, ordev-co-chairs— capitalization and exact spacing don't matter; it's matched against the real teams) - List the GitHub usernames and/or email addresses, one per line
- Submit
The workflow checks you're allowed (see below), then for each person:
- Already an IHE org member → added to the team immediately.
- Not yet a member → sent an organization invitation; they join the team automatically once they accept.
It comments back on the issue with a per-person result and closes the issue.
Who can use it: members of
dev-co-chairs, or a maintainer of the specific team you're adding to. Anyone else is declined.Eligible teams: any per-repo team (a child of
devices-domain) anddev-co-chairs.
If the person is already in the IHE org, a team Maintainer can add them directly:
- Team page → Members tab → "Add a member"
- Search their username → Add
This path cannot invite someone who isn't in the org yet — for that, use the automation above (or ask an Org Owner to send the org invite first).
This grants a whole team access to a repository at a chosen permission level. Do it from the repo side (it's the most reliable path in the UI).
You need Admin on the repo (Domain Leads and
dev-co-chairshave this).
- Go to the repo:
github.com/IHE/{repo} - Settings tab → left sidebar "Collaborators and teams" (under Access).
- Under Teams, click "Add teams".
- Search for the team (e.g.
WIA writer) → select it. - A "Role" dropdown appears → set the permission to match the team name per the convention table:
… writer→ Write… maintainer→ Maintain
- Click "Add … to this repository".
To change an existing team's permission later: same page → find the team in the list → use its Role dropdown → pick the new level.
Doing it from the team side instead: team page → "Repositories" tab → "Add repository" → pick the repo → set the role. Same result; use whichever you find easier.
| I want to… | Where | Key step |
|---|---|---|
| Let someone manage a team | orgs/IHE/teams/{team} → Members |
Tick their checkbox → "change role" → Maintainer |
| Add someone (new or existing) to a team | DEV.tooling → New Issue | "Add People to a Team" — handles the org invite too |
| Add an existing org member to a team | orgs/IHE/teams/{team} → Members |
"Add a member" → search → Add |
| Give a team access to a repo | IHE/{repo} → Settings → Collaborators and teams |
"Add teams" → set Role to match the name |
| Fix a wrong permission | same as above | Use the team's Role dropdown |
| Make a child (sub) team | orgs/IHE/new-team |
Set "Parent team" to devices-domain when creating |
- Domain Lead Playbook — day-to-day team and repo management
- Org Admin Playbook — one-time team creation, org-level setup
- GitHub App Setup & Maintenance — how new repos get their teams automatically
- Governance — roles and responsibilities