# Commit Messages

Follow [Conventional Commits](https://www.conventionalcommits.org/) enforced by commitlint.

## Format

```
type(scope): lowercase description
```

- **type**: Category of change (required)
- **scope**: Package or area affected (required)
- **description**: Short summary in lowercase (required)

## Types

| Type       | Use for                                      |
| ---------- | -------------------------------------------- |
| `feat`     | New feature                                  |
| `fix`      | Bug fix                                      |
| `chore`    | Maintenance (deps, configs, no prod changes) |
| `docs`     | Documentation only                           |
| `refactor` | Code change that doesn't fix or add features |
| `perf`     | Performance improvement                      |
| `test`     | Adding or updating tests                     |
| `ci`       | CI/CD changes                                |
| `build`    | Build system changes                         |
| `style`    | Code style (formatting, semicolons, etc.)    |

## Breaking Changes

Use `!` suffix on type for breaking changes:

```
feat(core)!: remove deprecated API
refactor(store)!: rename feature methods
```

The `!` signals breaking changes in the changelog.

## Examples

```
feat(html): add volume slider component
fix(store): prevent race condition in state sync
chore(root): bump vitest to v3
docs(core): document request lifecycle
refactor(utils): simplify event listener cleanup
test(html): add slider interaction tests
```

## WIP Commits

Commits starting with `wip` (case-insensitive) bypass commitlint validation. Use sparingly for work-in-progress that will be squashed.

## No Co-Author Trailers

Do NOT add `Co-Authored-By` trailers to commit messages. The commit author is sufficient attribution.

## Authoritative Source

See `commitlint.config.js` for the enforced scope list.
