diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index b8064e14..bb689390 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -47,6 +47,7 @@ Always loaded: | `.claude/rules/commit-guidelines.md` | Commit message format and prefixes | | `.claude/rules/pull-requests.md` | PR title and description conventions | | `.claude/rules/agent-instructions.md` | Delegation limits and implementation scope | +| `.claude/rules/release.md` | Release guardrails — never hand-edit versions or tags | Loaded on demand, when a matching file is read (`paths:` frontmatter): diff --git a/.claude/rules/release.md b/.claude/rules/release.md new file mode 100644 index 00000000..fa5c7ff5 --- /dev/null +++ b/.claude/rules/release.md @@ -0,0 +1,17 @@ +--- +description: Release guardrails — what never to do by hand. Full procedure is the /release skill. +--- + +# Release + +The procedure lives in the `/release` skill (invoke it deliberately; it does not auto-load). +These constraints apply regardless of whether that skill was invoked. + +- **`release-prepare.yml` is the only sanctioned path** for bumping a version or creating a release + tag. Do not edit `version.properties` or `VERSION` by hand, and do not create `v*` tags manually — + `validate-tag` in `release-tag.yml` rejects anything not matching `v-(rc|beta)N`. +- **`tools/release/bump.sh` is the single source of truth for version logic.** Its versionCode + formula mirrors `buildSrc/src/main/java/ProjectConfig.kt` — the two must stay in sync. +- CI runs `./tools/release/bump.sh --mode=check` on every PR (`check-release-tooling` in + `code-checks.yml`). If you did touch `version.properties` or `VERSION`, run that locally first. +- All numeric version fields are bounded `0..99`; the versionCode formula collapses at ≥100.