Configuration reference¶
An Octoform configuration declares the GitHub state the operator intends to
manage. The root file requires only owner; every omitted policy value remains
unmanaged.
Configuration map¶
The account¶
| Area | Fields and decisions |
|---|---|
| Document composition | owner, owners, imports, policies, exclude, relative paths, circular imports |
| Selection and precedence | defaults, types, repos, type, manage, tri-state overrides |
| Classification and audit | classify, rule conditions, audit, read-only findings |
| The organization block | organization.profile, organization.members, reach and risk |
| Custom properties | organization.properties definitions and repository properties values |
| Organization rulesets | organization.rulesets and the repositories they select |
| Teams and membership | organization.teams, nesting, and who is on each one |
| Organization roles | organization.roles, granted to users and teams |
The repository¶
| Area | Fields and decisions |
|---|---|
| Repository settings | features, merge, repo metadata, visibility, archive state and rename |
| Security settings | Dependabot, secret scanning, private reporting, CodeQL default setup, immutable releases |
| Branches and rulesets | default_branch, ensure_branches, repository rulesets and capability evidence |
| Ruleset rules | Every target, rule and bypass actor a ruleset can carry |
| Classic branch protection | branch_protection, and why one branch takes one mechanism |
| Repository access | access.users, access.teams, and stating a revocation |
| Labels and milestones | labels, milestones, rename_from, mode: absent |
| Environments | Environment creation and required user reviewers |
| Files | Safe create-if-missing repository file seeding |
Organization membership is the one area that is deliberately not declarative.
See octoform members.
Common field contract¶
Every field page answers the same operational questions:
- Shape: where the field appears and which values it accepts.
- Omission: whether an absent or
nullvalue remains unmanaged. - Resolution: which precedence layer supplies the effective value.
- Observation: which GitHub evidence Octoform reads before planning.
- Plan: how drift, warnings, and blocked operations appear.
- Apply: which endpoint or mutation receives an executable change.
- Recovery: how to restore or stop managing the setting.
Value semantics¶
Scalar policy values are tri-state:
| Declared value | Meaning |
|---|---|
| A concrete value | Manage the field and converge on that value. |
null |
Cancel an inherited value at this narrower layer. |
| Omitted | Do not introduce a value at this layer. |
After resolution, null and omission both mean that the effective field is
unmanaged. Lists such as rulesets, environments, and files are compared
according to their resource-specific rules; they are not scalar toggles.
Because null is already taken, every resource that can be removed has its
own word for it, and each one has to be written:
| To remove | Write |
|---|---|
| A collaborator or team grant | none |
| A label, milestone, team, or property definition | mode: absent |
| A repository custom property value | '' or [] |
Deleting a line from the file never removes anything.
See core concepts for worked precedence examples and the plan command for interpreting the resulting diff.
Global boundaries¶
- Archived repositories are observed but receive no planned mutations, unless the policy is unarchiving them.
- An unreadable current value produces a blocked change, not an assumed value.
- Octoform
0.5never deletes an undeclared ruleset, environment, branch, team, property definition, or repository file. Removal happens only where a policy states it. - Owner plan names are not configuration. Availability is inferred from owner kind, visibility, permissions, and GitHub responses.
- A declaration that does not apply to the kind of account that declared it is
reported, not silently ignored.
--strictturns that report into a failure.