Merge Policy¶
Merge Requirements¶
Every PR must meet these conditions before merging:
- CI green — all checks pass (tests, lint, type-check, build)
- At least 1 approval from a maintainer
- No unresolved conversations — all review comments addressed
- Branch up to date with target branch (rebase or merge from target)
- CHANGELOG updated — if the change is user-facing
Merge Strategy¶
| Branch type | Merge method | Why |
|---|---|---|
feature/* → main |
Squash merge | Clean history — one commit per feature |
fix/* → main |
Squash merge | Clean history — one commit per fix |
fix/* → release/* |
Squash merge | Same rationale |
release/* → main |
Merge commit | Preserves the release branch history |
hotfix/* → main |
Squash merge | One atomic fix |
Squash merge commit message¶
When squashing, the final commit message should follow Conventional Commits:
The PR number is appended automatically by GitHub.
Stale PR Policy¶
| Condition | Action |
|---|---|
| No activity for 14 days | Maintainer pings the author |
| No activity for 30 days | PR labeled stale |
| No activity for 45 days | PR closed with comment (can be reopened) |
Draft PRs are exempt from the stale policy.
Conflict Resolution¶
- Rebase preferred over merge commits for feature/fix branches
- If conflicts are complex, merge from target branch into the PR branch
- Never force-push a branch that has active reviewers without warning them
Branch Cleanup¶
- Feature and fix branches are deleted after merge (GitHub auto-delete enabled)
- Release branches are kept until the next minor release
- Tags are never deleted