.agents/skills/openclaw-changelog-update/SKILL.md
Use this for release changelog rewrites and GitHub release-note source text.
This is mandatory before every beta, beta rerun, stable release, or stable
rerun. Use it with release-openclaw-maintainer; this skill owns changelog
content, ordering, grouping, and attribution discipline.
Rebuild the target CHANGELOG.md version section from a complete, generated
history manifest, not stale draft notes. Produce grouped user-facing release
notes sorted by user interest while preserving every relevant issue/PR ref and
every human Thanks @... attribution.
YYYY.M.PATCH, without beta suffix.Start on main before branching when possible:
git fetch --tags origingit pull --ff-onlygit status -sbAudit history, including direct commits:
git log --first-parent --date=iso-strict --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>git log --first-parent --grep='(#' --date=short --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>--since='24 hours ago' when main moved during the release.Generate the complete contribution record and editorial manifest before writing grouped prose:
node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \
--write-ledger
--seed-ref <pre-backfill-ref> once so
contribution records from the prior changelog are retained even when an
older merged commit omitted its PR number; the verifier excludes records
for work reverted after the base tag, including beta work reverted before
the stable release### Highlights, ### Changes, or
### Fixes; do not carry old grouped prose forward without re-auditing itRewrite one stable-base section only:
## YYYY.M.PATCH## Unreleased section above the target releaseUnreleased contains release-bound notes, fold them into the target
section instead of deleting themSection shape:
### Highlights: 5-8 bullets, broad user wins first
### Changes: new capabilities and behavior changes### Fixes: user-facing fixes first, grouped by impact and surface### Complete contribution record: generated PR-first record after the
grouped prose; it is the exhaustive accounting surface, not a second
release summaryPreserve attribution:
#issue, (#PR), Fixes #..., and Thanks @...Thanks @author, even when the PR had no linked issueFixes #... or referenced bug issue
represented by a user-facing entry needs Thanks @reporter unless the
same handle is already thanked in that bulletCo-authored-by contributor on represented user-facing work
needs Thanks @handle when a GitHub handle is knownThanks @... handles in one bullet are expected; do not drop or
collapse contributor credit just because the note is grouped#NNN references. Do not add a separate
linked-issues inventory. The generated PR record keeps source issues
inline as Related #NNN on the PR that shipped them**PR #NNN**; source PRs include GitHub commit associations and merged
PR references explicitly present in active commit subjects/bodies. It
preserves author/co-author credit and any issue references in the original
title#### Direct commits dump. Add
direct-commit credit to a grouped bullet only when it shares an explicit
closing issue reference or at least two distinctive subject termsdocs, test, refactor, ci, build, chore,
and style PRs in Highlights, Changes, or Fixes. Keep those internal
contributions in the complete PR record, but do not give them editorial
release-note spaceQA, test, docs, refactor, lint, or CI; an
untyped title is not automatically editorial@claude, @openclaw, @clawsweeper, or @steipeteSorting preference:
Keep bullets single-line unless existing file style forces otherwise. Avoid internal release-process noise unless it changes user install/update safety.
Check release-note side conditions:
src/plugins/compat/registry.tssrc/commands/doctor/shared/deprecation-compat.tsremoveAfter is on/before release date, resolve it
or explicitly record the blocker before shippingValidate and ship:
node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \
--write-ledger
#NNN reference in release history or the
rendered release section cannot resolve, when reverted work is presented
as shipped, when a source PR is absent from the contribution record, when
direct commits are rendered as a public record dump, when non-editorial
PRs appear in grouped prose, or when an eligible PR author or known
co-author is missing from that PR's Thanks @... credit#NNN references resolve against openclaw/openclaw;
cross-repository references such as openclaw/imsg#141 remain literal
text and must not be rewritten as local issue linksnode .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
--base <base-tag> \
--target <target-ref> \
--version <YYYY.M.PATCH> \
--release-tag v<YYYY.M.PATCH> \
--check-github
--release-tag for every beta and stable page in the train; a
### Release verification tail is permitted, but any other body drift
fails the check; the GitHub body must begin with the complete
## YYYY.M.PATCH changelog section, including its headinggit diff --checkscripts/committer "docs(changelog): refresh YYYY.M.PATCH notes" CHANGELOG.mdmainIf GitHub API quota is exhausted, do not idle. Continue work that does not need GitHub API:
npm view checksOnly GitHub Release creation, workflow dispatch, run polling, artifact download, and issue/PR mutation need API quota.