I would prefer to use rulesets rather than branch protection rules. (They do mostly the same thing)
Ruleset:
- Require 0 approvers, or require 1 while allowing maintainer to override.
- Require code integration tests to pass
- Require title check to pass
- Require pull request (no commits directly to main)
In general settings:
- Allow only squash and merge. This will ensure a linear version history.
- Automatically delete the branch after the pull request is merged. (It can be restored via GitHub if needed)
- (optional) When clicking squash and merge, copy the PR description to the commit message
- Enable this button

I would prefer to use rulesets rather than branch protection rules. (They do mostly the same thing)
Ruleset:
In general settings: