The organization block¶
Everything else in a configuration describes a repository. The organization
block describes the account above them.
owner: example-org
organization:
profile:
description: Platform engineering for the example estate
website: https://example.invalid
members:
base_permission: read
create_public_repositories: false
fork_private_repositories: false
Shape: an optional organization object at the root of a single-owner
file, or under owners.<login> in a multi-owner one. It is resolved per
account and is never inherited from one account to another: an organization
policy is about one specific organization.
The block has six parts. This page covers the first two; each of the others has its own page.
| Key | What it declares |
|---|---|
profile |
The organization's public identity |
members |
What members may do without being asked |
properties |
Custom property definitions |
rulesets |
Rulesets aimed at repositories the organization selects |
teams |
Teams, their nesting, and who is on them |
roles |
Who holds each organization role |
It is planned, not commanded¶
Nothing here has a command of its own. Organization changes appear in the same plan as repository changes, are confirmed the same way, and are grouped under a heading that cannot be mistaken for a repository name:
2 change(s) across 1 repositories:
(example-org: the organisation itself)
organization.members.base_permission: write -> read
organization.profile.description: (unset) -> Platform engineering for the example estate
A setting that decides something about every repository an account owns should never be the one thing nobody saw a diff for. That is the whole reason for putting it in the plan rather than behind a subcommand.
profile¶
organization:
profile:
name: Example Platform
description: Platform engineering for the example estate
company: Example
website: https://example.invalid
location: Remote
email: platform@example.invalid
twitter_username: example
| Field | Type | Notes |
|---|---|---|
name |
string or null |
Display name. It is not the login, and setting it does not rename the account. |
description |
string or null |
|
company |
string or null |
|
website |
string or null |
GitHub's API calls this field blog. The configuration does not, because nothing about it is a blog. |
location |
string or null |
|
email |
string or null |
The public contact address, which is not the billing address. |
twitter_username |
string or null |
An empty string and an unset value are the same absence, so declaring ''
clears a field. null means what it means everywhere else in the
configuration: stop managing this key at this layer.
Every profile field is reported as normal risk. Changing the description of
an organization is a change to a description.
members¶
What members may do without asking anybody.
organization:
members:
base_permission: read
create_repositories: true
create_public_repositories: false
create_private_repositories: true
create_internal_repositories: false
fork_private_repositories: false
create_pages: true
create_public_pages: false
create_private_pages: true
web_commit_signoff_required: true
deploy_keys_enabled: false
organization_projects: true
repository_projects: false
| Field | Type | Meaning |
|---|---|---|
base_permission |
none, read, write, admin |
What every member gets on every repository, before any grant adds to it. |
create_repositories |
boolean | Whether members may create repositories at all. |
create_public_repositories |
boolean | |
create_private_repositories |
boolean | |
create_internal_repositories |
boolean | Enterprise Cloud only. GitHub ignores it elsewhere. |
fork_private_repositories |
boolean | Whether a private repository of this organization can be forked at all. |
create_pages |
boolean | |
create_public_pages |
boolean | |
create_private_pages |
boolean | |
web_commit_signoff_required |
boolean | Require every web commit to be signed off, across the organization. |
deploy_keys_enabled |
boolean | Whether repositories may use deploy keys at all. |
organization_projects |
boolean | |
repository_projects |
boolean |
Reach, and why eight of these are sensitive¶
base_permission is a floor, not a grant. Every member holds at least that
level on every repository the organization owns — including repositories no
configuration names and nobody was reading the plan for. Lowering it takes
access away from people who never appeared in any policy; raising it hands
access to people no policy mentions.
The same argument covers the creation switches, forking, web commit sign-off
and deploy keys: each decides something about repositories that do not exist
yet, or about all of them at once. Those eight are reported as sensitive:
base_permissioncreate_repositoriescreate_public_repositoriescreate_private_repositoriescreate_internal_repositoriesfork_private_repositoriesweb_commit_signoff_requireddeploy_keys_enabled
The remaining member settings, and every profile field, are normal.
One deliberate omission¶
members_allowed_repository_creation_type is not modelled. GitHub documents it
as closing down, and documents that using it overrides create_repositories —
so a file that set both would have the field on its way out silently win. The
three per-visibility switches say the same thing without that hazard.
The security defaults for new repositories are absent for the same kind of reason. GitHub documents every one of them as closing down on this endpoint in favour of code security configurations, and a governance tool has no business writing a setting whose own API says to stop using it.
Personal accounts¶
A personal account has no profile block, no member policies, no custom properties, no teams, no roles and no organization rulesets. Declaring any of them under a personal account produces a blocked change naming the account and the reason, so a shared preset stays shareable:
1 not applied:
(example-personal: the organisation itself)
organization.members.base_permission: (unset) -> read [skipped: "example-personal" is a personal account, which has none of the organisation settings]
Pass --strict to fail the run instead of reporting it.
Observation and blocking¶
The organization is read once per account, before any repository is touched.
- Settings that could not be read block rather than being planned over. There is no default assumed for an organization setting.
- An unreadable individual value blocks only itself.
- A change is applied in one
PATCH, before any repository work begins, so a lowered base permission is never briefly wider than the file asks for.
Recovery¶
Declare the previous value and run again. There is no rollback command; see incidents and recovery for what a second run can and cannot undo.
Removing the block from the file stops managing those keys. It does not restore what they were.