Every commit: valid Conventional Commit, atomic, on the right short-lived branch.
git status --short and git diff --stat.text
<type>[optional scope][!]: <imperative lowercase description>
[optional body]
[optional footer(s)]
scripts/validate_commit_message.py before committing.: .Token: value. Hyphens in tokens except BREAKING CHANGE.! and/or BREAKING CHANGE: footer for breaking changes.WIP, misc, update, or vague summaries.TypeWhenSemVerfeatnew featureminorfixbug fixpatchrefactorrestructure, no behavior changenoneperfperformance improvementnone (patch if fixes bug)docsdocumentation onlynonetesttests onlynonebuildbuild system / depsnoneciCI/CD changesnonechoremaintenance / toolingnonestyleformatting onlynonerevertrevert prior commitdepends
Use a consistent noun for the dominant area. Omit only when truly cross-cutting. Never multiple scopes in one commit line.
Split when:
One type, one intent per commit. If you can't describe it that way, split.
bash
python3 scripts/validate_commit_message.py --message "feat(auth): add otp fallback"