Operator order 2026-11-08 (via Main), modelled on core CHANGELOG.md 16.2.3: - Section order: Breaking, Added, Changed, Fixed, Version jumps, Upgrade notes, Contributors. - Version jumps (net since X.Y.Z): in a repository that pins a version per role, one "*role*: old to new" line per role whose roles/*/meta/services.yml version differs between tag and HEAD; a bump twice shows once, a change and change back not at all; a change that is no version bump needs judgement, never a jump line. The same comparison covers ref and *_version keys, meta/addons/*.yml pins, renamed or split roles paired old to new (a rename without alias is also Breaking plus an Upgrade note), requirements.galaxy.yml and pyproject.toml pins (classes found by Main on core v16.2.3..main). - Contributors: always, one "[Name](URL): areas" line per human author and Co-authored-by trailer, names through .mailmap, bots and AI co-authors left out, the URL from earlier CHANGELOG.md or packaging/debian/changelog entries, asked for when missing. - Net counting: after a long-lived branch merge the commit list repeats released work under other SHAs, so every line is judged against git diff tag..HEAD and the earlier entries. The details live in sections.md, read on demand, so SKILL.md stays within its 600-word cap. Evidence: make test 652 OK, markdownlint 0 errors (/tmp/rename-changelog-make-test-4.log), markdownlint of sections.md after its last edit 0 errors. 🎯 Fix: 92 % 💥 Break: 3 % 💸 Cost: 100 % ⏱️ Time: – 🛡️ Security: 100 % 🏆 Score: 89 🚦 Gate: ✅ 90/5, cost and time <= 100, security 100 % Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.6 KiB
name, description
| name | description |
|---|---|
| kvb-release-changelog | Write the `pkgmgr release` message; prints only. Trigger on "release message", "changelog entry", before cutting a release, or pkgmgr's markdown-lint rejection. |
Read reasons.md next to this file when a rule does not fit or a lint
finding is unclear, and special.md for: no tag, a failed previous-tag
workflow, a test- or CI-only release, no markdownlint-cli2, a pasted pkgmgr
rejection.
1. Find the range
git fetch --tags
git describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*'
git log --no-merges --format='%h %s%n%b' <tag>..HEAD
- The base is the newest
vX.Y.Ztag reachable from HEAD. - Drop
Release version X.Y.Zcommits, and any revert together with the commit it reverts inside the range. - A subject is a lead, not the change: read the diff (
git show --stat, then the hunks) when it does not say what changed for the user. - With
gh, read every workflow of the previous tag's commit and of HEAD (gh run list --commit <sha> --json workflowName,status,conclusion), not one picked by-L 1. Only a finished failure counts; queued, running or missing runs are normal.
2. Sort into sections
feat: Added, or Changed when it alters existing behaviour. fix, perf:
Fixed. ! or BREAKING CHANGE:: Breaking, plus one Upgrade notes line per
required action. docs, style, refactor, test, ci, build,
chore: omitted unless a user sees the effect. Dependency bumps: one
line, or omitted. Order: Breaking, Added, Changed, Fixed, Version
jumps, Upgrade notes, Contributors (always, with URLs: sections.md);
empty sections left out.
3. Format
- Section labels are plain lines ending in
:; no#headings, no bold-only lines. - No version heading, date or "Release X.Y.Z" line.
- One bullet, one line: too long means shorter, never wrapped.
- Line length: the repository's MD013 limit (default 80); aim for 78 or less.
- Lists: no nesting, a blank line before and after (MD004, MD032), the
marker of the existing CHANGELOG.md's first list item;
-without a CHANGELOG.md, the configured one when the repo's MD004 pins a style. - No backticks or code blocks: names, --flags and paths in
*italics;*, not_, for emphasis (MD049). - Bullets read
Area: effect: the component the user knows (Backup, Restore, CLI, Tests), then what changed for them, not how the code changed. No commit SHAs, no em dashes (use:or;). - No trailing whitespace (MD009), double blank lines (MD012) or bare URLs;
wrap URLs as
<https://...>(MD034).
4. Lint it the way pkgmgr does
- Write
# Changelog, blank line,## [X.Y.Z] - <date>, blank line, the message to a scratch file outside the repository. - From the repository root, so its config applies:
markdownlint-cli2 --no-globs - < <scratch-file>. - A finding on line N is message line N - 4: shorten it and lint again; print nothing before 0 errors.
- Lint a scratch copy of CHANGELOG.md with the wrapped entry inserted below
its
# Changelogline the same way. A finding in older entries that the unmodified file lacks comes from the new entry: fix the message, never the older entries.
5. Output
- The message in one fenced
textblock, nothing else inside it. Bump: patch | minor | majorand why (breaking: major,feat: minor, otherwise patch).- The lint result (
markdownlint-cli2: 0 errorsor the manual check run). - Only when a workflow on HEAD finished as a failure: its name and run, and the advice not to release before it is green.
Then stop. Never edit CHANGELOG.md or a version file, never run
pkgmgr release, never tag: the operator releases.