.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.origin/main, fetched before verification. Release
notes cite the original merged main PR when the same work is carried by a
backport. A release-branch PR is used only while no forward-port exists on
main by the release target cutoff.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> \
--main-ref origin/main \
--version <YYYY.M.PATCH> \
--manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \
--write-ledger
The verifier automatically reuses public GitHub GraphQL responses from an
exact base/target SHA snapshot under the worktree's git metadata. Iterative
rewrites at the same target avoid repeated network discovery. Use
--refresh-github-snapshot after suspect API data, --github-snapshot <path> for an explicit artifact, or --no-github-snapshot for a live-only
audit. GitHub release bodies are always read live.
--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--shipped-ref <prior-shipped-tag> when the reachable main
closeout differs from the shipped tag or later forward-port commits
re-associate PRs that were already released. Each tag is a cumulative
shipped boundary: the verifier unions explicit PR rows from complete
contribution records in numbered release sections, excludes only overlapping PRs,
and ignores Unreleased. Never infer this boundary from the base SHA,
target prose, or target record. The manifest and generated provenance retain
each tag plus the exact excluded PR inventory and count for deterministic
candidate validationmain: explicit
cherry-pick origins win, then a unique normalized-subject match requires
the same author and an overlapping changed path. Suppress the backport PR
when that main PR exists by the target cutoff. Keep the release-branch PR
only when the change has not yet been forward-ported### 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> \
--main-ref origin/main \
--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. It also fails
before history collection when --base is not an ancestor of --target,
when ### Highlights has fewer than five or more than eight top-level
bullets, or when the existing prose/record names a PR outside the source
range. Only an explicit --seed-ref may add historical PR inventory; an
explicit repeatable --shipped-ref may subtract PRs proven present in a
prior shipped tag#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 checkscripts/render-github-release-notes.mjs is the canonical release-body
renderer used by candidate validation, publish, and verification. When the
complete ## YYYY.M.PATCH section fits GitHub's 125,000-character limit and
the renderer's matching 125,000-byte safety ceiling, the body must contain
that exact section including its heading### Complete contribution record, then emits that heading with a stable
link to the full contribution record in the tag-pinned CHANGELOG.md.
Never truncate a bullet or partial record, and never hand-author a different
compact form### Release verification only when it fits after the canonical full
or compact body is chosen. If it does not fit, omit the body tail and retain
the immutable attached release evidence; never compact a fitting full
contribution record just to preserve the optional tailpnpm release:candidate performs this deterministic render check from the
exact tag before it dispatches Full Release Validation, including when local
generated checks are explicitly skippedgit 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.