How it works
01 /
Validate individual headers
The ci-toolkit/commit-messages Check Run evaluates the commits on a pull request against the Conventional Commits header shape. Types, optional scopes and the breaking-change marker fit one recognizable structure. The report identifies offending commits rather than leaving the author to inspect the entire history.
02 /
Choose the policy for your merge style
Use the title policy when squash-merge headlines are your primary concern. Add commit_messages when preserving branch history, using merge commits or expecting each commit to carry meaningful release information. Both checks can run together.
03 /
Refuse an incomplete view of history
GitHub’s PR-commits endpoint has a 250-commit ceiling. ci-toolkit compares the API result with the declared commit count and fails closed if the PR exceeds the limit or the response omits commits. It does not pass a policy check after inspecting only part of the history.
A concrete example
Supported .ci-toolkit.yml
api_version: ci-toolkit/v1alpha1
pull_requests:
commit_messages:
format: conventional-commitsKnow the boundary
Current limits
This is a format check, not proof that a commit description accurately explains the code. It does not rewrite messages for you. Enforcement uses the default-branch policy, and GitHub plan restrictions may prevent the additional synchronous metadata rule.
Common questions
Can a PR disable its own commit policy?
No. The proposed configuration is checked separately; effective policy comes from the trusted default branch.
Does this support arbitrarily large PR histories?
No. The current implementation refuses incomplete evidence beyond GitHub’s 250-commit API limit. Split or simplify the history before relying on this check.
Runnerless / early access
Want this in
your workflow?
Get early access ↗Register interest and tell us what slows your CI down. The optional follow-up questions come after your email is saved.