@@ -49,28 +49,29 @@ behaviour change that affects packet contents or timing —
4949reviewers shouldn't have to reverse-engineer why a constant moved
5050or a probe interval changed.
5151
52- ## 3. Commit message conventions
53-
54- Commit messages are linted by ` commitlint ` with
55- ` @commitlint/config-conventional ` , _ and_ by ` commitizen ` in
56- pre-commit (` stages: [commit-msg] ` ). Both must pass.
57-
58- - ** Conventional Commits prefix is required.** Pick from:
59- ` feat ` , ` fix ` , ` perf ` , ` refactor ` , ` docs ` , ` test ` , ` build ` ,
60- ` ci ` , ` chore ` , ` style ` , ` revert ` . The ` feat ` /` fix ` /` perf `
61- prefixes show up in the release-notes; ` chore* ` and ` ci* ` are
62- excluded by semantic-release (` exclude_commit_patterns ` in
63- ` pyproject.toml ` ), so use those for housekeeping.
52+ ## 3. PR title conventions
53+
54+ PRs are squash-merged, so the PR title becomes the commit on
55+ ` master ` . Only the PR title is linted (by the ` pr-title ` CI job
56+ running ` amannn/action-semantic-pull-request ` ); per-commit
57+ messages on the PR branch are not checked.
58+
59+ - ** Conventional Commits prefix is required on the PR title.**
60+ Pick from: ` feat ` , ` fix ` , ` perf ` , ` refactor ` , ` docs ` , ` test ` ,
61+ ` build ` , ` ci ` , ` chore ` , ` style ` , ` revert ` . The
62+ ` feat ` /` fix ` /` perf ` prefixes show up in the release-notes;
63+ ` chore* ` and ` ci* ` are excluded by semantic-release
64+ (` exclude_commit_patterns ` in ` pyproject.toml ` ), so use those
65+ for housekeeping.
6466- ** Imperative-mood subject.** "fix: handle empty answer", not
6567 "fix: handled empty answer".
66- - ** No header length cap.** The commitlint config sets
67- ` header-max-length: [0, "always", Infinity] ` , so a slightly
68- longer subject is fine if it earns the space; don't pad.
68+ - ** Lowercase first character after the prefix** (enforced by
69+ ` subjectPattern: ^(?![A-Z]).+$ ` ).
6970- ** No ` Co-Authored-By ` trailers from automated agents.**
70- - ** One logical change per commit .** Let pre-commit run (ruff
71+ - ** One logical change per PR .** Let pre-commit run (ruff
7172 lint + format, mypy, flake8, codespell, cython-lint,
7273 pyupgrade). If a hook auto-fixes something, re-stage and
73- re-commit; the commit-msg hook re-runs on the new commit .
74+ re-commit.
7475
7576## 4. Cython / ` .pxd ` discipline
7677
@@ -101,22 +102,23 @@ Always pass the body via `--body-file`, never `--body "..."` with
101102shell-escaping — Markdown backticks, asterisks, and angle
102103brackets must pass through verbatim.
103104
104- The PR title should match the commit subject (same Conventional
105- Commits prefix). If the PR ends up squash-merged, the title
106- becomes the merged commit message, so it has to satisfy
107- commitlint on its own .
105+ The PR title is what gets enforced — it becomes the squash-merge
106+ commit subject on ` master ` , so it has to parse as a Conventional
107+ Commit on its own. Per- commit messages on the branch are not
108+ linted .
108109
109110## 6. After the PR is open
110111
111112CI runs three jobs:
112113
113114- ` lint ` — ` pre-commit/action ` . If pre-commit passed locally
114115 this passes too.
115- - ` commitlint ` — ` wagoid/commitlint-github-action ` . Validates
116- every commit on the PR; if you amended after pushing, force-
117- push the branch so the rewritten commits get linted.
118- - ` test ` — the full pytest matrix across CPython 3.9–3.14,
119- 3.14t (free-threaded), and PyPy 3.9 / 3.10, on Linux + macOS +
116+ - ` pr-title ` — ` amannn/action-semantic-pull-request ` . Validates
117+ the PR title against Conventional Commits. If it fails, fix
118+ the title in the GitHub UI or with ` gh pr edit --title "..." ` ;
119+ the workflow re-runs on the edit, no push needed.
120+ - ` test ` — the full pytest matrix across CPython 3.10–3.14,
121+ 3.14t (free-threaded), and PyPy 3.10, on Linux + macOS +
120122 Windows. The free-threaded entry is the canary for unguarded
121123 shared-state bugs; failures there are often genuine even when
122124 the GIL-enabled rows pass.
0 commit comments