Conventional Commits
Enforced by tools/commit_schema.py on both the commit-msg hook and PR titles. The PR title becomes the squash-commit subject.
- type(scope): subject — subject ≤ 100 chars, no trailing period
- feat/fix require a scope; scopes map 1:1 to release-notes labels
- Breaking change: append ! and a BREAKING CHANGE: footer

