@@ -12,10 +12,10 @@ content, ordering, grouping, and attribution discipline.
1212
1313## Goal
1414
15- Rewrite the target ` CHANGELOG.md ` version section from history, not from stale
16- draft notes. Produce grouped user-facing release notes sorted by user interest
17- while preserving every relevant issue/PR ref and every human ` Thanks @... `
18- attribution.
15+ Rebuild the target ` CHANGELOG.md ` version section from a complete, generated
16+ history manifest, not stale draft notes. Produce grouped user-facing release
17+ notes sorted by user interest while preserving every relevant issue/PR ref and
18+ every human ` Thanks @... ` attribution.
1919
2020## Inputs
2121
@@ -34,8 +34,37 @@ attribution.
3434 - ` git log --first-parent --date=iso-strict --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref> `
3535 - ` git log --first-parent --grep='(#' --date=short --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref> `
3636 - also inspect ` --since='24 hours ago' ` when main moved during the release.
37- 3 . Read linked PRs/issues or diffs for ambiguous commits. Direct commits matter;
38- infer notes from subject, body, touched files, tests, and nearby commits.
37+ 3 . Generate the complete contribution record and editorial manifest before
38+ writing grouped prose:
39+
40+ ``` bash
41+ node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
42+ --base < base-tag> \
43+ --target < target-ref> \
44+ --version < YYYY.M.PATCH> \
45+ --manifest /tmp/openclaw-release-< YYYY.M.PATCH> .json \
46+ --write-ledger
47+ ```
48+
49+ - the manifest is the required input to the rewrite, not an after-the-fact
50+ audit; it contains every referenced PR, eligible contributor credit,
51+ inline issue context, every direct commit, and an editorial-eligibility
52+ classification for PRs and direct commits
53+ - for a historical backfill, add ` --seed-ref <pre-backfill-ref> ` once so
54+ contribution records from the prior changelog are retained even when an
55+ older merged commit omitted its PR number; the verifier excludes records
56+ for work reverted after the base tag, including beta work reverted before
57+ the stable release
58+ - source PR discovery combines merged GitHub commit associations with merged
59+ PR references explicitly present in active commit subjects/bodies so
60+ cherry-picks and squash commits remain accounted for. Resolve every
61+ association page and exclude PRs merged after the target release commit
62+ - read the manifest before editing ` ### Highlights ` , ` ### Changes ` , or
63+ ` ### Fixes ` ; do not carry old grouped prose forward without re-auditing it
64+ - inspect linked PRs/issues or diffs for ambiguous commits. Direct commits
65+ are editorial input, not public ledger rows; infer material user outcomes
66+ from subject, body, touched files, tests, and nearby commits
67+
39684 . Rewrite one stable-base section only:
4069 - use ` ## YYYY.M.PATCH `
4170 - do not create beta-specific headings
@@ -44,10 +73,21 @@ attribution.
4473 section instead of deleting them
45745 . Section shape:
4675 - ` ### Highlights ` : 5-8 bullets, broad user wins first
76+ - include only a clear user-visible capability or workflow unlock, a
77+ material reliability/safety fix, a broad cross-surface improvement, or
78+ a release-defining integration/compatibility milestone
79+ - every highlight must say what changed for a user in one sentence; use
80+ one user story per bullet and group its supporting PRs
81+ - exclude tests, CI, refactors, docs, catalog churn, and implementation
82+ detail unless the outcome is a material install/update, data-safety, or
83+ widely visible user improvement
4784 - ` ### Changes ` : new capabilities and behavior changes
4885 - ` ### Fixes ` : user-facing fixes first, grouped by impact and surface
4986 - group related changes/fixes by surface and user impact; avoid one bullet
5087 per tiny commit when several commits tell one user-facing story
88+ - ` ### Complete contribution record ` : generated PR-first record after the
89+ grouped prose; it is the exhaustive accounting surface, not a second
90+ release summary
51916 . Preserve attribution:
5292 - keep ` #issue ` , ` (#PR) ` , ` Fixes #... ` , and ` Thanks @... `
5393 - every human-authored merged PR represented by a user-facing entry needs
@@ -62,17 +102,35 @@ attribution.
62102 - multiple ` Thanks @... ` handles in one bullet are expected; do not drop or
63103 collapse contributor credit just because the note is grouped
64104 - if one grouped bullet covers both direct commits and PRs, keep all PR refs
65- and thanks, plus any issue refs from the direct commits
66- - before finalizing, audit the final release-note body:
67- - extract all ` #NNN ` refs from the notes
68- - resolve which refs are PRs and collect human PR authors
69- - resolve issue refs used as bug/report refs and collect human reporters
70- - scan represented commits for ` Co-authored-by `
71- - compare those handles to the final ` Thanks @... ` set
72- - fix every missing human credit or explicitly record why it is omitted
105+ and thanks, plus any issue refs and human credit from the direct work
106+ - issues remain normal inline ` #NNN ` references. Do not add a separate
107+ linked-issues inventory. The generated PR record keeps source issues
108+ inline as ` Related #NNN ` on the PR that shipped them
109+ - when backfilling an older linked-issues inventory, preserve reporter
110+ credit inline for every GitHub-confirmed closing PR relationship. Do not
111+ infer a PR relationship from a generic cross-reference event, invent an
112+ unrelated PR link for a standalone report, or recreate the retired
113+ inventory
114+ - the complete contribution record lists every merged source PR exactly once
115+ as ` **PR #NNN** ` ; source PRs include GitHub commit associations and merged
116+ PR references explicitly present in active commit subjects/bodies. It
117+ preserves author/co-author credit and any issue references in the original
118+ title
119+ - direct commits remain in the manifest with GitHub-resolved author,
120+ co-author, issue, and editorial-eligibility data. They inform grouped
121+ prose but are never rendered as a public ` #### Direct commits ` dump. Add
122+ direct-commit credit to a grouped bullet only when it shares an explicit
123+ closing issue reference or at least two distinctive subject terms
124+ - the verifier rejects ` docs ` , ` test ` , ` refactor ` , ` ci ` , ` build ` , ` chore ` ,
125+ and ` style ` PRs in Highlights, Changes, or Fixes. Keep those internal
126+ contributions in the complete PR record, but do not give them editorial
127+ release-note space
128+ - classify internal-only work from conventional prefixes and clear title
129+ signals such as ` QA ` , ` test ` , ` docs ` , ` refactor ` , ` lint ` , or ` CI ` ; an
130+ untyped title is not automatically editorial
73131 - do not add GHSA references, advisory IDs, or security advisory slugs to
74132 changelog entries or GitHub release-note text unless explicitly requested
75- - never thank bots, ` @openclaw ` , ` @clawsweeper ` , or ` @steipete `
133+ - never thank bots, ` @claude ` , ` @ openclaw` , ` @clawsweeper ` , or ` @steipete `
76134 - do not use GitHub's release contributor count as the source of truth; the
77135 changelog must carry the complete human credit set itself
781367 . Sorting preference:
@@ -91,36 +149,50 @@ attribution.
91149 - if any compatibility ` removeAfter ` is on/before release date, resolve it
92150 or explicitly record the blocker before shipping
9315110 . Validate and ship:
94- - generate and verify the complete contribution ledger before committing:
95- ``` bash
96- node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
97- --base < base-tag> \
98- --target < target-ref> \
99- --version < YYYY.M.PATCH> \
100- --write-ledger
101- ```
102- - the command fails when any ` # NNN` reference in release history or the
103- rendered release section is absent from the ledger, when reverted work is
104- presented as shipped, or when an eligible PR author, issue reporter, or
105- known co-author is missing from that entry' s `Thanks @...` credit
106- - after the GitHub release or prerelease is published, verify every matching
107- release page against the same source section:
108- ```bash
109- node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
110- --base <base-tag> \
111- --target <target-ref> \
112- --version <YYYY.M.PATCH> \
113- --release-tag v<YYYY.M.PATCH> \
114- --check-github
115- ```
116- - add one `--release-tag` for every beta and stable page in the train; a
117- `### Release verification` tail is permitted, but any other body drift
118- fails the check; the GitHub body must begin with the complete
119- `## YYYY.M.PATCH` changelog section, including its heading
120- - `git diff --check`
121- - for docs/changelog-only changes, no broad tests are required
122- - commit with `scripts/committer "docs(changelog): refresh YYYY.M.PATCH notes" CHANGELOG.md`
123- - push, pull/rebase if needed, then branch/rebase release from latest `main`
152+
153+ - after the manifest-driven rewrite, regenerate and verify the complete
154+ contribution record before committing:
155+ ``` bash
156+ node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
157+ --base < base-tag> \
158+ --target < target-ref> \
159+ --version < YYYY.M.PATCH> \
160+ --manifest /tmp/openclaw-release-< YYYY.M.PATCH> .json \
161+ --write-ledger
162+ ```
163+ - the command fails when any ` #NNN ` reference in release history or the
164+ rendered release section cannot resolve, when reverted work is presented
165+ as shipped, when a source PR is absent from the contribution record, when
166+ direct commits are rendered as a public record dump, when non-editorial
167+ PRs appear in grouped prose, or when an eligible PR author or known
168+ co-author is missing from that PR's ` Thanks @... ` credit
169+ - when grouped prose names a PR, that same bullet must retain every
170+ contributor and linked-reporter credit from its generated PR record
171+ - unqualified ` #NNN ` references resolve against ` openclaw/openclaw ` ;
172+ cross-repository references such as ` openclaw/imsg#141 ` remain literal
173+ text and must not be rewritten as local issue links
174+ - after the GitHub release or prerelease is published, verify every matching
175+ release page against the same source section:
176+ ``` bash
177+ node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \
178+ --base < base-tag> \
179+ --target < target-ref> \
180+ --version < YYYY.M.PATCH> \
181+ --release-tag v< YYYY.M.PATCH> \
182+ --check-github
183+ ```
184+ - add one ` --release-tag ` for every beta and stable page in the train; a
185+ ` ### Release verification ` tail is permitted, but any other body drift
186+ fails the check; the GitHub body must begin with the complete
187+ ` ## YYYY.M.PATCH ` changelog section, including its heading
188+ - GitHub release bodies are limited to 125,000 characters. If the complete
189+ source section plus an existing verification tail exceeds that limit, keep
190+ the source section intact and omit the tail; never truncate the
191+ contribution record
192+ - ` git diff --check `
193+ - for docs/changelog-only changes, no broad tests are required
194+ - commit with ` scripts/committer "docs(changelog): refresh YYYY.M.PATCH notes" CHANGELOG.md `
195+ - push, pull/rebase if needed, then branch/rebase release from latest ` main `
124196
125197## Quota / API Outage Rule
126198
0 commit comments