···16161717- Respect file boundary naming (`public/*.api.ts`, `domain/*.schema.ts`, `internal/runtime/*.effect.ts`).
1818- Use only public package exports across packages.
1919+2020+## Commits
2121+2222+Use conventional commits. The changelog is generated from these prefixes:
2323+- `feat:` / `fix:` / `refactor:` / `perf:` / `docs:` / `chore:` / `style:`
2424+- Scoped prefixes are fine: `feat(core): add persistence layer`
2525+- `chore(release):` and `release:` commits are excluded from the changelog
2626+2727+## Releasing
2828+2929+Binary: `mill`. CLI entrypoint: `packages/cli/src/bin/mill.ts`. Version lives in `packages/cli/package.json`.
3030+3131+To cut a release:
3232+1. Bump version in `packages/cli/package.json`, commit: `chore(release): vX.Y.Z`
3333+2. Push to main, then tag and push: `git tag vX.Y.Z && git push origin vX.Y.Z`
3434+3. CI compiles standalone binaries via `bun build --compile`, generates changelog, creates GitHub release, and updates the Homebrew formula in `laulauland/homebrew-tap`
3535+3636+Requires `TAP_GITHUB_TOKEN` repo secret (PAT with write access to `laulauland/homebrew-tap`).