โ—€ Playbook index
NO.30.8

โš–๏ธ Governance

Updated: 2026-09-11

In one line

Governance is deciding who can do what.

Start with your orgs. Then shape them with teams, policies and rulesets.

Rules flow downward, to repos and to Copilot.

Three org models ๐Ÿ“– Docs ๐Ÿข Ricoh case

First decision: how many orgs? Each model changes what everyone can see by default.

โ–ธ Click a model

1 ยท Single org

Single organization

Everything in one org; teams and repo permissions do the rest. By default you only see the repos you're added to (Org base permission = None). Left there it silos people, so add an all-members team to shared repos by default.

2 ยท Red / Green / SB

Red-green-sandbox

You run three orgs. ๐ŸŸข Green is the default home, ~90% of repos: everyone reads and pushes from day one, so InnerSource happens (base permission = Write). ๐Ÿ”ด Red is confidential, invite-only (base permission = None). ๐ŸŸก Sandbox is for experiments, and takes personal repos if you block them (base permission = Write).

3 ยท Portfolio

Portfolio company

One org per top-level division (one below the CEO). Reorgs happen inside a division, so those survive. Orgs move between enterprises, which helps with M&A.

๐Ÿข FIELD CASE โ€” RICOH

One org per department meant 100+ orgs and no way to find code. Now one shared org everyone can join hosts InnerSource and publishes the enterprise settings as Markdown.

Granting access ๐Ÿ“– Docs

Now let people in: IdP โ†’ teams โ†’ repos. Never individuals.

flowchart LR
  IDP["๐Ÿชช IdP (Okta)<br/>single source"]
  ENT["๐Ÿ›๏ธ Enterprise Team ๐Ÿ“–<br/>Admin ยท all orgs"]
  ORG["๐Ÿข Org Team ๐Ÿ“–<br/>this org ยท from org chart"]
  REPO["๐Ÿ“ฆ Repository"]
  IDP -->|SCIM| ENT
  IDP -->|SCIM| ORG
  ORG -->|Write etc.| REPO
  ENT -->|Admin| REPO

  classDef idp fill:#1a0a2e,stroke:#ffb000,color:#ffb000,stroke-width:2px
  classDef ent fill:#2a0a0a,stroke:#ff5555,color:#ff5555,stroke-width:2px
  classDef org fill:#0a0e27,stroke:#00f0ff,color:#00f0ff,stroke-width:2px
  classDef repo fill:#0a1a14,stroke:#9bbc0f,color:#9bbc0f,stroke-width:2px
  class IDP idp
  class ENT ent
  class ORG org
  class REPO repo

  click ENT href "https://docs.github.com/en/enterprise-cloud@latest/admin/managing-accounts-and-repositories/managing-users-in-your-enterprise/create-enterprise-teams" "Enterprise teams docs" _blank
  click ORG href "https://docs.github.com/en/organizations/organizing-members-into-teams/about-teams" "Organization teams docs" _blank

Policies

People are in. Policies decide what they may do โ€” set at org and enterprise, never at the repo.

  • ๐Ÿ›๏ธ Enterprise โ€” SSO / SCIM, allowed features, base policy for every org
  • ๐Ÿข Org โ€” member privileges, repo creation, 2FA, Copilot and Actions access
  • ๐Ÿ“ฆ Repo โ€” holds no policy, only inherits. The one thing a repo adds is a ruleset.
  • ๐Ÿ” Rules flow down. An org can tighten enterprise rules, never loosen them.

๐ŸŽฏ Set guardrails top-down. Never repo by repo. Org policies โ†— ยท Enterprise policies โ†—

Admin roles ๐Ÿ“– Docs

Policies are set. Now, who may change them? That is not a repo role.

  • ๐Ÿ›๏ธ Enterprise owner โ€” every setting and policy, yet no org settings or content by default
  • ๐Ÿข Org owner โ€” full control of one org. Keep it small, never below two.
  • ๐Ÿ›ก๏ธ Security manager โ€” read on every repo plus alert management. Security teams need no Owner
  • ๐Ÿงฉ Custom org roles โ€” bundle only what is needed, e.g. โ€œview the audit logโ€ (GHEC)

๐ŸŽฏ Owner is a key, not a job title. Look for a smaller role first. Org roles โ†— ยท Custom org roles โ†—

Repository roles

Now inside the repo: who does what. Roles are cumulative.

RoleAdds to the role below
๐Ÿ‘€ ReadView, clone, open issues
๐Ÿ”บ TriageManage issues and PRs โ€” label, assign, close
โœ๏ธ WritePush and merge
๐Ÿ› ๏ธ MaintainNon-destructive repo settings
๐Ÿ‘‘ AdminFull control โ€” access, visibility, deletion

๐Ÿงฉ If none fit, build a custom repository role at org level from any base role. Custom roles โ†—

Rulesets ๐Ÿ“– Docs

Policies say what is allowed, roles say who acts. Rulesets say what the code must pass.

  • ๐Ÿ›ก๏ธ Branch protectionโ€™s successor โ€” reviews, checks, signing, force-push bans, in one object
  • ๐Ÿ›๏ธ Defined at ENT / ORG / REPO โ€” set it high and every repo below inherits it
  • ๐Ÿ” They stack โ€” when several apply, the strictest wins. No loosening below
  • ๐Ÿงช Evaluate mode โ€” measure impact without enforcing. Start here on existing repos

๐ŸŽฏ Donโ€™t grant bypass. A ruleset with bypass is a request, not a rule. Org rulesets โ†—

12 anti-patterns

That is the structure. Here is what breaks it. 01, 02 and 11 are the hard ones to undo.

โ–ธ Click a number โ€” the damage, then the fix

01Org per team

01One org per team or project

โŒ ResultCollaboration fragments, admin work multiplies, innersource stops working.

โœ… InsteadDraw the boundary with teams and repo permissions inside one org.

02Orgs = org chart

02Orgs mapped to the management hierarchy

โŒ ResultEvery reorg forces a matching GitHub restructure.

โœ… InsteadMap only to the highest, static divisions โ€” or not at all.

03Admin as base

03Admin granted as the base permission

โŒ ResultEvery member gets destructive rights on every repo.

โœ… InsteadBase Read or Write, then elevate through teams.

04Allow all Actions

04"Allow all actions" with no review

โŒ ResultUnvetted third-party actions become a supply-chain path into your builds.

โœ… InsteadKeep an allow list and pin actions by commit SHA.

05Unlimited spending

05Spending limits left unlimited

โŒ ResultInvoiced accounts default to unlimited, so overspend is silent.

โœ… InsteadSet explicit limits and track them with cost centers.

06Manual provisioning

06Manual user provisioning only

โŒ ResultLeavers keep their access, because nothing revokes it.

โœ… InsteadSCIM provisioning and deprovisioning from the IdP.

07API polling

07Polling the API instead of using webhooks

โŒ ResultBurns the rate limit and adds load for no new information.

โœ… InsteadEvent-driven webhooks.

08Log retention

08Ignoring audit log retention

โŒ ResultDefault retention is short, so evidence is gone when you need it.

โœ… InsteadConfigure audit log streaming or export.

09App per org

09Enterprise-wide apps installed org by org

โŒ ResultAdmin work multiplies, approvals scatter, configuration drifts.

โœ… InsteadEnterprise-level GitHub App installation.

10Owner for everything

10Owner where a custom role would do

โŒ ResultEnterprise and Org Owner are far broader than the actual need.

โœ… InsteadCustom roles scoped to one capability.

11Late model switch

11Changing the user access model after rollout

โŒ ResultStandard โ†” EMU is a migration, not a setting you flip.

โœ… InsteadChoose it when the enterprise is created.

12No offboarding

12No offboarding path

โŒ ResultDormant accounts keep access and keep consuming licences.

โœ… InsteadUnaffiliated users policy plus SCIM deprovisioning.

SELECT A NUMBER โ–ธ

The 18 guardrails ๐Ÿ“– Docs

Now the values to set, and who sets them. Short on time? 03, 15, 18.

โ–ธ Click a number ยท ENT / ORG / REPO = where you set it

01Actions scope

01Actions execution scopeORG

โš™๏ธ Set toRestrict Actions to specific repositories, not all of them.

02Allowed actions

02Which actions may runENT

โš™๏ธ Set toGitHub-created and Verified Creator only.

03Workflow token

03Default workflow token permissionENT / ORG

โš™๏ธ Set toread-only. It ships as read/write.

๐Ÿ’ก WhyA stolen token can otherwise write through Actions.

04PR auto-approval

04Automatic approval of pull requestsENT / ORG

โš™๏ธ Set toDisabled. It is on by default.

๐Ÿ’ก WhyOtherwise a PR can be merged around code review.

05Forking

05Repository forkingENT / ORG

โš™๏ธ Set toOff unless a repo clearly needs it.

06Visibility change

06Changing repository visibilityENT / ORG

โš™๏ธ Set toRestrict who can flip a repo's visibility.

07Fine-grained PATs

07Fine-grained personal access tokensENT / ORG

โš™๏ธ Set toRequire an approval flow.

๐Ÿ’ก WhyYou get a review of who reaches what, with which permission.

08Outside collabs

08Inviting outside collaboratorsENT

โš™๏ธ Set toOwners only. It ships as "No policy", so any member can invite.

09Public repos

09Creating public repositoriesENT

โš™๏ธ Set toBlocked, unless open source is governed separately.

10Webhook secret

10Webhook secretORG / REPO

โš™๏ธ Set toAlways set, so the receiver can verify the signature.

11Webhook SSL

11Webhook transportORG / REPO

โš™๏ธ Set toSSL on every endpoint.

12Rulesets

12Repository rulesetsENT / ORG / REPO

โš™๏ธ Set toUse rulesets for reviews, checks and protected branches.

13CODEOWNERS

13CODEOWNERSREPO

โš™๏ธ Set toDefine it under .github/, with an explicit owner per path.

14Commit signing

14Commit signingREPO

โš™๏ธ Set toRequired wherever possible.

๐Ÿ’ก WhyBlocks commit injection. Copilot cloud agent commits are already signed.

15Ruleset bypass

15Bypassing rulesetsREPO

โš™๏ธ Set toNot allowed. A ruleset with a bypass list is a suggestion.

16Runner groups

16Runner groupsENT / ORG

โš™๏ธ Set toAssign each group to a limited set of repos.

๐Ÿ’ก WhyA group open to every repo exposes self-hosted runners.

17Push protection

17Bypassing push protectionORG

โš™๏ธ Set toLimit to named roles and teams. By default anyone with write can bypass.

18Audit log stream

18Audit log streamingENT

โš™๏ธ Set toConfigured, to your SIEM or object store.

๐Ÿ’ก WhyThe most forgotten item, and the best source for spotting abuse.

SELECT A NUMBER โ–ธ

Copilot managed settings (NEW)

Same idea for Copilot clients: copilot/managed-settings.json overrides local settings. Order: MDM โ†’ server-managed โ†’ file โ†’ user. All keys โ†—

โ–ธ + reveals what the key controls ยท the date opens its changelog

model2026-07-01

Make auto model selection the default, so nobody picks a model by hand.

permissions.*2026-06-17

Block bypass / YOLO mode, and gate sensitive operations behind approval.

enabledPlugins ยท marketplaces2026-08-26

Approve which plugins run and where they come from, with autoUpdate.

allowedMcpServers ยท deniedMcpServers2026-08-06

MCP allowlist by URL or command. Fail-closed: off the list, it does not run.

telemetry2026-07-08

OpenTelemetry export to your own collector.

teams/ + team-mappings.json2026-08-03

One baseline, plus a variation per enterprise team on overridable keys.

.github-private & source org

They live in one repo you own, set in Enterprise โ†’ AI controls โ†’ Agents.

.github-private/
โ”œโ”€โ”€ agents/                    # published enterprise-wide
โ”œโ”€โ”€ .github/agents/            # staging, test before publishing
โ””โ”€โ”€ copilot/
    โ”œโ”€โ”€ managed-settings.json  # the baseline
    โ”œโ”€โ”€ team-mappings.json     # file โ†’ enterprise team
    โ””โ”€โ”€ teams/*.json           # per-team override
  • ๐Ÿข You pick the org. The repo name and copilot/ paths are fixed.
  • ๐Ÿ”’ Applies to everyone on the plan, repo access or not. Keep it internal and guard copilot/** with CODEOWNERS.

โ˜… Where it fits

Five layers, one rule: set them from the top.

LayerScopeExamples
๐Ÿข Policiesorg โ†’ enterprise2FA, visibility, feature access
๐Ÿ”‘ Admin rolesorg โ†’ enterpriseOwner, Security manager, custom
๐Ÿ‘ค Permission rolesRepositoryRead / Write / Admin
๐Ÿ›ก๏ธ RulesetsBranches and tagsRequired reviews, required checks, signing
๐Ÿค– Managed settingsCopilot clientsDefault model, bypass lock, plugins

๐ŸŽฏ Top-down wins. Per-repo does not scale.