Repository navigation
Description
Overview
We need devops and devops-security to match incubator's repository permissions, because incubator is the only one of our repos configured the way we want and the other two diverge in two ways: hackforla/devops grants access to four teams outside the CoP, and neither repo has the devops-merge team on its default branch's push allow-list. The devops-* teams should be the only teams on any of our repos, and they should mean the same thing on all of them.
Action Items
- Remove the four non-DevOps teams from
hackforla/devops, so it carries only the fivedevops-*teams like the other three repos do.DELETE orgs/hackforla/teams/<slug>/repos/hackforla/devopsfor each:
-product-managment— read, 416 members
-product-managment-write— write, 319 members
-guides— read, 46 members
-guides-write— write, 7 members - Add the
devops-mergeteam to the default branch push allow-list ondevops/masteranddevops-security/main, so all four repos readteams=["devops-merge"].incubatorandcheck-ghpages-versionsalready do. - Confirm the starting state before changing anything, so this is done against fact rather than against this issue. Per repo,
gh api repos/hackforla/<repo>/branches/<branch>/protectionand read.restrictions:
-devops(master) anddevops-security(main) — restriction on,users=[] teams=[] apps=[]
-incubator(main) andcheck-ghpages-versions(main) — restriction on,teams=["devops-merge"]
An absentrestrictionskey means the toggle is off; an empty list means the toggle is on and nobody is allowed. Those are different states, the difference is visible only in the API, and getting them the wrong way round is easy. - Change nothing else about branch protection. Correction, found 2026-09-07 while capturing state: they are not all identical.
devops-securitycarries abypass_pull_request_allowancesnamingchelseykleinindividually, whichdevopsandincubatordo not; an earlier comparison flattened that object and missed it. It was deliberately left in place (Alex, 2026-09-07), and is redundant anyway sincechelseykleinis indevops-adminandenforce_adminsisfalse. The remaining settings are identical across the three main repos — one required approving review, dismiss stale reviews on,block_creationson,required_conversation_resolutionon, no required status checks, no force pushes, no deletions,enforce_adminsoff.restrictions.teamsis the only axis that was changed.
Method note for anyone repeating this: it was done through the sub-resource endpoints (DELETE orgs/.../teams/<slug>/repos/...andPOST repos/.../branches/<br>/protection/restrictions/teams), neverPUT .../protection. A fullPUTreplaces the whole object and would have silently dropped devops-security's bypass allowance. - Confirm
enforce_adminsisfalseon all four repos and leave it that way. This is deliberate and settled — repo admins are meant to bypass the push restriction and the required review. Nothing to change; the item exists so the state is checked rather than assumed. - Carry the admin-bypass decision forward to where a reader of the permission model will meet it, rather than leaving it only on this issue — it reads as a weakness to anyone auditing branch protection, and without a record someone will eventually "fix" it. Done by making it a requirement on Replace the TBD stub on the Permission Levels for Team Members wiki page #196 rather than by writing the page here, which would have deadlocked the two issues against each other. Replace the TBD stub on the Permission Levels for Team Members wiki page #196's action items now require the page to state that the bypass is deliberate; the page itself is Replace the TBD stub on the Permission Levels for Team Members wiki page #196's deliverable, not this one's.
- None of this leaves a PR or a diff for anyone to review. Capture the current team list and the full protection JSON for every affected repo before touching anything, and attach them to this issue. Reversal: re-add a team with
PUT orgs/hackforla/teams/<slug>/repos/hackforla/devopsand{"permission":"pull"}or"push"as captured; remove an allow-list entry withDELETE repos/hackforla/<repo>/branches/<branch>/protection/restrictions/teamsand body["devops-merge"]. - Verify afterwards, with the negative assertions as the important half:
gh api repos/hackforla/<repo>/teamsreturns exactly the fivedevops-*teams on all four repos;.restrictionsnamesdevops-mergeand nothing else — no users, no apps; and the other fifteen protection axes are unchanged on the two repos you touched, diffed against the capture.
Resources/Instructions
-
Verified live 2026-09-07; re-derive before acting. Neither team grants nor branch protection carry any change history in GitHub, so nothing here can be dated from the API afterwards.
-
Current team grants —
devopsis the only outlier:Repo Teams with access devopsthe five devops-*plusproduct-managment,product-managment-write,guides,guides-writedevops-securitythe five devops-*incubatorthe five devops-*check-ghpages-versionsthe five devops-* -
The two read grants convey nothing and can go without further thought. All four repos are public, so
product-managment(416 members) andguides(46) grant read access that every person on the internet already has. -
The two write grants are the real finding: 326 people hold push on
hackforla/devops, where the CoP's own write team is 12. Branch protection stops them merging tomaster, but push is still push. -
These four teams are in scope only because they appear on our repository's access list, and the rule is that our repos carry the
devops-*teams and nothing else. Removing a grant does not touch the team itself — each keeps existing and keeps its access to every other repo in the org. No coordination with Product or Guides is needed and none should be sought. -
Removing them is safe, checked three ways rather than assumed. In 37 pull requests ever opened on
hackforla/devops, zero came from someone inproduct-managment-writeorguides-writewho is not also indevops-read. Of the five distinct assignees across all open issues, four are indevops-readand the fifth (VAntonina, on Document our "break-glass" account details #71) is in none of these four teams, so nobody loses an assignment. The guides-labelled issues are authored and assigned by DevOps people rather than by the Guides team. -
On the push allow-list, the change is a no-op in practice today, and that is what makes it safe rather than what makes it pointless.
devops-mergeis{RSkuma, ale210, chelseyklein}anddevops-adminis{ExperimentsInHonesty, RSkuma, ale210, chelseyklein}— a strict superset — and sinceenforce_adminsisfalse, admins already bypass the restriction. What changes is that the permission stops depending on that coincidence: today, adding someone todevops-mergewho is not also an admin gives them no ability to merge on two of the four repos. -
This is the org's established pattern, not a new invention.
hackforla/websiterestrictsgh-pagestowebsite-merge, with two required reviews. -
The
incubator-*teams are not in scope and must not be touched. Despite the name they have nothing to do withhackforla/incubator— they grant onVRMS,HomeUniteUsandballotnav, and 9 of their members are in nodevops-*team, i.e. they are project people. Removing them would cut project contributors off from their own repositories. -
enforce_admins: falseis intended and stays — decided 2026-09-07 (Alex). Repo admins are not subject to the push restriction or the required approving review, on all four repos. That is the desired configuration rather than drift. No rationale was recorded and none should be reconstructed. Do not re-raise it as a finding, and do not set it totrueas part of this work. -
Blocks Replace the TBD stub on the Permission Levels for Team Members wiki page #196, which documents the permission model on the wiki. Doing this first means that page describes one rule for all four repos and one set of teams, instead of documenting inconsistencies and then needing an edit when they are fixed.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsDone
Activity
[-]Put the devops-merge team on the push allow-list for devops and devops-security[/-][+]Align devops and devops-security with incubator's permissions: only devops-* teams, and devops-merge on the push allow-list[/+]