






















@@ -12,10 +12,10 @@ content, ordering, grouping, and attribution discipline.
12121313## Goal
141415-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.
19192020## 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`
124196125197## Quota / API Outage Rule
126198此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。