github:globex:# the organisation's loginmembers:[all:globex:employee]# in the organisation, with or without a teamteams:team-platform:# the team's SLUG, not its display namemembers:[all:platform:engineer]maintainers:[all:platform:lead]team-security:members:[all:security:analyst]acme:teams:team-platform:members:[all:platform:engineer]ignore:-[email protected]# an address in a bound group nobody can take out-temp-owner# a GitHub login: temporary owner, break-glass seat
Key
Meaning
members (organisation)
people in the organisation without a team; membership of a bound team is implied
teams.<slug>.members
internal groups whose holders are team members
teams.<slug>.maintainers
internal groups whose holders are maintainers; wins over a member group
ignore
addresses or logins never managed: never invited, added, removed or changed; files merge by union
Rule
Value
Effect
grants nothing; appears in no token; the GitHub controller makes each organisation match
Same slug in two organisations
two teams
Organisation owner
not in the policy; recorded at connect (ownership)
Console
the Rules page lists each binding beside other rules
Refused
Note
a group nothing declares
a team with neither members nor maintainers
an organisation binding no group and no team
remove it to stop managing it
a team declared twice across merged files
an organisation's members declared twice
github.<org>.owner
the message says the owner is chosen on the console
slack:workspaces:acme:# a key WE choosechannels:# by channel NAME, as Slack spells iteng-private:{private:true, mode:strict, ignore:[[email protected],U0123ABCD], from:[acme:eng:member]}ops:{from:[acme:sre:member], adopt:C0123ABCD}# adopt an existing channel by idglobex:{}# declared; its channels are bound elsewhere
The Slack controller runs in the issuer. It changes only controllers.slack.enabledWorkspaces; other workspaces are dry runs. See Connect a Slack workspace and the Slack reconciler.
Key
Meaning
workspace key
lowercase letters, digits, -; starts and ends alphanumeric; at most 40 characters. Team, owner and domains: ownership
channel name
as Slack spells it: lowercase letters, digits, -, _; at most 80
from
required; internal groups whose holders the channel contains; Slack user groups unsupported
private
the channel is private; never converts visibility
mode
extend (default) only adds; strict adds and removes, needs private: true
ignore
addresses or Slack user ids (U0123ABCD) that strict never removes; needs mode: strict
adopt
channel id ^[CG][A-Z0-9]{8,}$ for a renamed channel or two candidates
Rule
Value
Fed by
internal groups only; members and sources belong to console channel records; members here is refused as unknown
Slack Connect channels
not in the policy
Git and console
console refuses a record for a channel bound here (same name or adopt id)
Defined in both
held on both sides, defined in both git and the console, until one is removed; no take-over
Creation
created if missing, else adopted by name; public channel joined, private channel the bot is in managed; adoption audited as roster.slack_channel.adopted
Never done (held with reason)
convert visibility; unarchive; create a second channel when an invisible private channel has the name
A file with an access key spells the same tables as camelCase lists. policy.ParseAccess (called by LoadDeclared) and sluisctl policy render turn it into a layer. It adds no concept. Chart documents.policy takes a rendered document.