Skip to content

feat!: generic rulesets interface with presets (org + per-repo) - #9

Merged
josmo merged 8 commits into
mainfrom
feat/generic-rulesets
Aug 16, 2026
Merged

feat!: generic rulesets interface with presets (org + per-repo) #9
josmo merged 8 commits into
mainfrom
feat/generic-rulesets

Conversation

@josmo

@josmo josmo commented Aug 16, 2026

Copy link
Copy Markdown
Member

What

Replaces the two bespoke org-ruleset knobs (baseline_ruleset,
require_signed_commits) with a single generic ruleset interface reused at
the organization and per-repository level, plus opt-in presets that are the
opinionated starting points. Default presets reproduce today's behavior, so
existing configs see no functional change beyond the input migration.

Added

  • Org: organization_rulesets (generic map) + enabled_presets. Presets:
    require_pull_request_reviews, restrict_deletions, require_signed_commits,
    block_force_pushes, require_linear_history. A custom organization_rulesets
    entry overrides a preset of the same name.
  • Per-repo: rulesets on the repositories object → github_repository_ruleset,
    scoped to the repo, with team-name bypass resolution.
  • Generic bypass_actors{ actor_type, actor_id, bypass_mode } (plus a
    per-repo team name convenience); OrganizationAdmin coerced to actor_id 1.
  • Validations for enforcement, target, bypass actor_type/bypass_mode
    at both levels; per-repo team-existence + team-bypass checks.

Breaking change

baseline_ruleset and require_signed_commits are removed.

# before                                                                                                                                                                                                          
baseline_ruleset       = { required_approving_review_count = 2 }                                                                                                                                                  
require_signed_commits  = true                                                                                                                                                                                    
# after — presets (defaults shown) + override the PR preset for 2 approvals                                                                                                                                       
enabled_presets = ["require_pull_request_reviews", "restrict_deletions", "require_signed_commits"]                                                                                                                
organization_rulesets = {                                                                                                                                                                                         
  require_pull_request_reviews = {                                                                                                                                                                                
    include_refs  = ["~DEFAULT_BRANCH"]                                                                                                                                                                           
    bypass_actors = [{ actor_type = "OrganizationAdmin" }]                                                                                                                                                        
    rules = { pull_request = { required_approving_review_count = 2, require_code_owner_review = true, required_review_thread_resolution = true } }                                                                
  }                                                                                                                                                                                                               
}                                                                                                                                                                                                                 
The single old "Baseline" ruleset now splits into two granular rulesets — functionally identical (rulesets compose). The signed_commits = false per-repo opt-out is preserved (feeds the require_signed_commits   
preset's exclusions).              

josmo added 8 commits August 15, 2026 22:08
Replace baseline_ruleset and require_signed_commits with a generic
organization_rulesets map driving a single for_each ruleset resource.
Curated presets (require_pull_request_reviews, restrict_deletions,
require_signed_commits, block_force_pushes, require_linear_history). Default
enabled set reproduces prior baseline + signed-commits behavior.
BREAKING CHANGE: baseline_ruleset and require_signed_commits are removed.
Use enabled_presets (defaults reproduce prior behavior) and
organization_rulesets; per-repo rulesets via repositories[].rulesets.
…g module

Adds enforcement, target, bypass actor_type/bypass_mode, and Team-bypass
completeness validations to modules/repository's repositories.rulesets,
mirroring modules/organization's organization_rulesets validations.
Also documents the dead actor_id=0 on the org module's admin bypass preset,
and adds a negative test for the new enforcement validation.
@josmo
josmo merged commit 900c1e9 into main Aug 16, 2026
5 checks passed
@josmo
josmo deleted the feat/generic-rulesets branch August 16, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant