How it works
01 /
Declare the title policy
Enable pull_requests.title in the default branch’s .ci-toolkit.yml. A separate ci-toolkit/pull-request-title Check Run validates the current PR title. Commit-message checking is an independent option: you can require a clean squash title without requiring every work-in-progress commit to follow that convention.
02 /
Check the title that matters
The accepted shape is <type>[optional scope][!]: <description>. A title such as fix(cache): handle an empty response communicates the change type and scope. The check produces a verdict and an explanation when the format is wrong.
03 /
Keep policy authority on the base branch
A proposed edit to the policy does not grant the same PR an exemption. Effective enforcement comes from the trusted default branch. The managed ruleset pins the App-owned check, and strict base freshness keeps the policy and merging head aligned.
A concrete example
Supported .ci-toolkit.yml
api_version: ci-toolkit/v1alpha1
pull_requests:
title:
format: conventional-commitsKnow the boundary
Current limits
Where supported by the GitHub repository plan, the toolkit also installs a commit-message metadata rule to check the eventual merge commit. When GitHub rejects that rule, the check explains that it is the only enforcement; this fallback cannot close every title-edit window at merge time.
Common questions
Does this check every commit in the PR?
No. Enable pull_requests.commit_messages separately when individual commit headers must also follow the convention.
Can I install Runnerless for this today?
The behavior exists in the private ci-toolkit GitHub App. Runnerless early access is an interest list; it is not a generally available installation.
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.