penpot/.serena/memories/workflow/creating-commits.md
Andrey Antukh 09736aa4c9 Enforce commit body line wrapping
Add a body line-length validator to scripts/check-commit. It
fails when a body line exceeds 76 characters, exempting
trailers, URLs, and unbreakable tokens. The 76 limit leaves
room for git log's four-space indent in an 80-column
terminal.

Align the subject limit with the documented 70 characters;
the checker allowed 90 before.

Document the rule as a hard, verifiable requirement in
AGENTS.md, CONTRIBUTING.md, the create-commit skill, and
the workflow memory, and point at scripts/check-commit.

Add tests for the validator and the subject length rule.

AI-assisted-by: deepseek-flash
2026-09-11 08:10:49 +00:00

2.4 KiB

Creating Commits

Commit only on explicit request. Before commit: git status; exclude unrelated user changes.

Do not guess or hallucinate git author information (Name or Email). Never include the --author flag in git commands unless specifically instructed by the user for a unique case; assume the local environment is already configured. Allow git commit to automatically pull the identity from the local git config user.name and user.email.

Message Format

:emoji: Subject line (imperative, capitalized, no period, <=70 chars)

Body explaining what changed and why.
Wrap lines at 76 characters — git log adds a
four-space indent, so 76 + 4 fits an 80-column
terminal. Keep each line concise.

AI-assisted-by: model-name

HARD RULES (inexcusable)

These rules are not advisory. Do not commit until every one holds. A commit that breaks them is wrong, even if the code is right.

  • Body lines MUST wrap at 76 characters or fewer. Measure every line; do not eyeball it. This is the rule most often skipped. Rationale: git log indents the body four spaces, so 76 + 4 fits an 80-column terminal.
  • Subject MUST be ≤70 chars, imperative, capitalized, no trailing period.
  • MUST be a blank line between subject and body.
  • MUST run scripts/check-commit and get exit code 0 before finishing. It mechanically validates the rules above; a failing run is a blocker.
    • It checks HEAD by default: ./scripts/check-commit
    • For another commit: ./scripts/check-commit -c <ref>
  • NEVER hand-wave the body as "one long line". If a line exceeds 76, break it at a space.
  • Exceptions inside the body (do not wrap these): Signed-off-by:, Co-authored-by:, AI-assisted-by: trailers, and lines carrying a URL.

AI-assisted-by trailer rules:

  • Use only the model name, e.g. mimo-v2.5, deepseek-v4-flash
  • Do NOT add prefixes like opencode-go/ — use the bare model name

Commit Type Emojis

:bug: bug fix · :sparkles: enhancement · :tada: new feature · :recycle: refactor · :lipstick: cosmetic · :ambulance: critical fix · :books: docs · :construction: WIP · :boom: breaking · :wrench: config · :zap: perf · :whale: docker · :paperclip: other · :arrow_up: dep upgrade · :arrow_down: dep downgrade · :fire: removal · :globe_with_meridians: translations · :rocket: epic/highlight

Referencing Issues

Use Closes #NNNN (not Fixes #NNNN) to link a commit to a GitHub issue.