OpenClaw Changelog Update
Use this for changelog rewrites and GitHub release-note source text. For regular
beta/stable, run it after the Code SHA passes Full Release Validation. For
extended-stable, run it before final exact-head validation and tagging. Do not
rerun it for tooling retries, resumed publication, or promotion.
Use it with release-openclaw-maintainer; this skill owns changelog content,
ordering, grouping, and attribution discipline.
Goal
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.
Inputs
- Target base version:
YYYY.M.PATCH, without beta suffix.
- Base tag: last reachable shipped release tag, usually the previous stable or
the previous beta train requested by the operator. It must be an ancestor of
the target; a newer but divergent tag is not a valid history boundary. Use
an explicit shipped/main-closeout SHA only when it is also reachable from the
target.
- Target ref: the exact green Code SHA. The changelog commit created from this
input becomes the Release SHA.
- Canonical main ref: current
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
current main.
Workflow
Confirm the release branch is at the fully validated Code SHA:
git fetch --tags origin
- confirm clean
git status -sb
- record
git rev-parse HEAD as the Code SHA
- record the successful Full Release Validation run id and attempt
- stop if any product/version/backport change is still pending
Audit 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>
- also inspect
--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
for an explicit artifact, or--no-github-snapshot` for a live-only
audit. GitHub release bodies are always read live.
- the manifest is the required input to the rewrite, not an after-the-fact
audit; it contains every referenced PR, eligible contributor credit,
inline issue context, every direct commit, and an editorial-eligibility
classification for PRs and direct commits
- schema version 3 is the required ephemeral manifest contract. Regenerate
older manifests; version 2 is not a supported downstream-reader boundary
- for a historical backfill, add
--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
- generated provenance reports in-range PRs separately from retained
seed-only PRs, then states the unique row total. A PR present in both
inventories counts as in-range; never describe the seed-inclusive total
as work merged in the current release range
- add repeatable
--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 validation
- source PR discovery combines merged GitHub commit associations with merged
PR references explicitly present in active commit subjects/bodies so
cherry-picks and squash commits remain accounted for. Resolve every
association page and exclude PRs merged after the target release commit
- canonicalize backports to the original merged PR on
main: explicit
cherry-pick origins win, then a unique normalized-subject match requires
the same author and an overlapping changed path. Suppress release/backport
PRs whenever the corresponding main PR exists on current origin/main.
Keep a release-branch PR only when that change landed there first and has
not yet been forward-ported to main
- read the manifest before editing
### Highlights, ### Changes, or
### Fixes; do not carry old grouped prose forward without re-auditing it
- inspect linked PRs/issues or diffs for ambiguous commits. Direct commits
are editorial input, not public ledger rows; infer material user outcomes
from subject, body, touched files, tests, and nearby commits
- Rewrite one stable-base section only:
- use
## YYYY.M.PATCH
- do not create beta-specific headings
- do not leave a stale
## Unreleased section above the target release
- if
Unreleased contains release-bound notes, fold them into the target
section instead of deleting them
- Section shape:
### Highlights: 5-8 bullets, broad user wins first
- include only a clear user-visible capability or workflow unlock, a
material reliability/safety fix, a broad cross-surface improvement, or
a release-defining integration/compatibility milestone
- every highlight must say what changed for a user in one sentence; use
one user story per bullet and group its supporting PRs
- exclude tests, CI, refactors, docs, catalog churn, and implementation
detail unless the outcome is a material install/update, data-safety, or
widely visible user improvement
### Changes: new capabilities and behavior changes
### Fixes: user-facing fixes first, grouped by impact and surface
- group related changes/fixes by surface and user impact; avoid one bullet
per tiny commit when several commits tell one user-facing story
### Complete contribution record: generated PR-first record after the
grouped prose; it is the exhaustive accounting surface, not a second
release summary
- Preserve attribution:
- keep
#issue, (#PR), Fixes #..., and Thanks @...
- every human-authored merged PR represented by a user-facing entry needs
its PR ref and
Thanks @author, even when the PR had no linked issue
- every human issue reporter for a
Fixes #... or referenced bug issue
represented by a user-facing entry needs Thanks @reporter unless the
same handle is already thanked in that bullet
- every human
Co-authored-by contributor on represented user-facing work
needs Thanks @handle when a GitHub handle is known
- when grouping multiple PRs/issues in one bullet, include every relevant
PR/issue ref and every human contributor handle in that same bullet
- multiple
Thanks @... handles in one bullet are expected; do not drop or
collapse contributor credit just because the note is grouped
- if one grouped bullet covers both direct commits and PRs, keep all PR refs
and thanks, plus any issue refs and human credit from the direct work
- issues remain normal inline
#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
- when backfilling an older linked-issues inventory, preserve reporter
credit inline for every GitHub-confirmed closing PR relationship. Do not
infer a PR relationship from a generic cross-reference event, invent an
unrelated PR link for a standalone report, or recreate the retired
inventory
- the complete contribution record lists every merged source PR exactly once
as
**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
- the provenance arithmetic and unique total must match the rendered PR
rows exactly; candidate validation rejects malformed or forged counts
- direct commits remain in the manifest with GitHub-resolved author,
co-author, issue, and editorial-eligibility data. They inform grouped
prose but are never rendered as a public
#### 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 terms
- the verifier rejects
docs, 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 space
- classify internal-only work from conventional prefixes and clear title
signals such as
QA, test, docs, refactor, lint, or CI; an
untyped title is not automatically editorial
- do not add GHSA references, advisory IDs, or security advisory slugs to
changelog entries or GitHub release-note text unless explicitly requested
- never thank bots,
@claude, @openclaw, @clawsweeper, or @steipete
- do not use GitHub's release contributor count as the source of truth; the
changelog must carry the complete human credit set itself
- Sorting preference:
- security/data-loss and content-boundary fixes
- transcript/replay/reply delivery correctness
- channels and mobile integrations
- providers/Codex/local model reliability
- install/update/release path reliability
- performance and observability
- docs and contributor-only/internal details last or omitted
- 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:
- inspect
src/plugins/compat/registry.ts
- inspect
src/commands/doctor/shared/deprecation-compat.ts
- if any compatibility
removeAfter is on/before release date, resolve it
or explicitly record the blocker before shipping
- Validate and ship:
- after the manifest-driven rewrite, regenerate and verify the complete
contribution record before committing:
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 command fails when any
#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
- when grouped prose names a PR, that same bullet must retain every
contributor and linked-reporter credit from its generated PR record
- unqualified
#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 links
- after the GitHub release or prerelease is published, verify every matching
release page against the same source section:
node .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
- add one
--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
scripts/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
- when the complete source section exceeds either limit, the renderer keeps the exact
grouped editorial notes through the line before
### 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
- append
### 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 tail
pnpm release:candidate performs this deterministic render check from the
exact tag before it dispatches Full Release Validation, including when local
generated checks are explicitly skipped
git diff --check
- for docs/changelog-only changes, no broad tests are required
- stage
CHANGELOG.md and commit with git commit -m "docs(changelog): refresh YYYY.M.PATCH notes"
- record the new commit as the Release SHA and require
git diff --name-only <code-sha>..<release-sha> to print only
CHANGELOG.md
- push the release branch without rebasing it onto moving
main
- dispatch SHA-pinned Full Release Validation for the Release SHA with evidence
reuse enabled. It must select
changelog-only-release-v1; any other changed
path returns the release to the Code SHA validation loop
Extended-Stable Variant
Extended-stable has one release commit and no GitHub Release body. After version
prep and approved backports, regenerate ## YYYY.M.P with the regular manifest
and original-main-PR provenance rules. Land it by PR, then validate the final
branch tip before tagging. Re-audit after a product backport; a tooling-only
repair needs no changelog entry. Never rewrite a published tag or changelog.
Quota / API Outage Rule
If GitHub API quota is exhausted, do not idle. Continue work that does not need
GitHub API:
- local changelog rewrite and release-note extraction
- local pretag checks and package/build sanity
- git push/tag checks over git protocol
- npm registry
npm view checks
- exact workflow-dispatch command preparation
Only GitHub Release creation, workflow dispatch, run polling, artifact download,
and issue/PR mutation need API quota.
1---2name: openclaw-changelog-update3description: Regenerate OpenClaw release changelog sections from git history before beta, stable, or extended-stable releases.4---56# OpenClaw Changelog Update78Use this for changelog rewrites and GitHub release-note source text. For regular9beta/stable, run it after the Code SHA passes Full Release Validation. For10extended-stable, run it before final exact-head validation and tagging. Do not11rerun it for tooling retries, resumed publication, or promotion.12Use it with `release-openclaw-maintainer`; this skill owns changelog content,13ordering, grouping, and attribution discipline.1415## Goal1617Rebuild the target `CHANGELOG.md` version section from a complete, generated18history manifest, not stale draft notes. Produce grouped user-facing release19notes sorted by user interest while preserving every relevant issue/PR ref and20every human `Thanks @...` attribution.2122## Inputs2324- Target base version: `YYYY.M.PATCH`, without beta suffix.25- Base tag: last reachable shipped release tag, usually the previous stable or26 the previous beta train requested by the operator. It must be an ancestor of27 the target; a newer but divergent tag is not a valid history boundary. Use28 an explicit shipped/main-closeout SHA only when it is also reachable from the29 target.30- Target ref: the exact green Code SHA. The changelog commit created from this31 input becomes the Release SHA.32- Canonical main ref: current `origin/main`, fetched before verification. Release33 notes cite the original merged main PR when the same work is carried by a34 backport. A release-branch PR is used only while no forward-port exists on35 current main.3637## Workflow38391. Confirm the release branch is at the fully validated Code SHA:40 - `git fetch --tags origin`41 - confirm clean `git status -sb`42 - record `git rev-parse HEAD` as the Code SHA43 - record the successful Full Release Validation run id and attempt44 - stop if any product/version/backport change is still pending452. Audit history, including direct commits:46 - `git log --first-parent --date=iso-strict --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>`47 - `git log --first-parent --grep='(#' --date=short --pretty=format:'%h%x09%ad%x09%s' <base-tag>..<target-ref>`48 - also inspect `--since='24 hours ago'` when main moved during the release.493. Generate the complete contribution record and editorial manifest before50 writing grouped prose:5152 ```bash53 node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \54 --base <base-tag> \55 --target <target-ref> \56 --main-ref origin/main \57 --version <YYYY.M.PATCH> \58 --manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \59 --write-ledger60 ```6162 The verifier automatically reuses public GitHub GraphQL responses from an63 exact base/target SHA snapshot under the worktree's git metadata. Iterative64 rewrites at the same target avoid repeated network discovery. Use65 `--refresh-github-snapshot` after suspect API data, `--github-snapshot66<path>` for an explicit artifact, or `--no-github-snapshot` for a live-only67 audit. GitHub release bodies are always read live.68 - the manifest is the required input to the rewrite, not an after-the-fact69 audit; it contains every referenced PR, eligible contributor credit,70 inline issue context, every direct commit, and an editorial-eligibility71 classification for PRs and direct commits72 - schema version 3 is the required ephemeral manifest contract. Regenerate73 older manifests; version 2 is not a supported downstream-reader boundary74 - for a historical backfill, add `--seed-ref <pre-backfill-ref>` once so75 contribution records from the prior changelog are retained even when an76 older merged commit omitted its PR number; the verifier excludes records77 for work reverted after the base tag, including beta work reverted before78 the stable release79 - generated provenance reports in-range PRs separately from retained80 seed-only PRs, then states the unique row total. A PR present in both81 inventories counts as in-range; never describe the seed-inclusive total82 as work merged in the current release range83 - add repeatable `--shipped-ref <prior-shipped-tag>` when the reachable main84 closeout differs from the shipped tag or later forward-port commits85 re-associate PRs that were already released. Each tag is a cumulative86 shipped boundary: the verifier unions explicit PR rows from complete87 contribution records in numbered release sections, excludes only overlapping PRs,88 and ignores `Unreleased`. Never infer this boundary from the base SHA,89 target prose, or target record. The manifest and generated provenance retain90 each tag plus the exact excluded PR inventory and count for deterministic91 candidate validation92 - source PR discovery combines merged GitHub commit associations with merged93 PR references explicitly present in active commit subjects/bodies so94 cherry-picks and squash commits remain accounted for. Resolve every95 association page and exclude PRs merged after the target release commit96 - canonicalize backports to the original merged PR on `main`: explicit97 cherry-pick origins win, then a unique normalized-subject match requires98 the same author and an overlapping changed path. Suppress release/backport99 PRs whenever the corresponding main PR exists on current `origin/main`.100 Keep a release-branch PR only when that change landed there first and has101 not yet been forward-ported to `main`102 - read the manifest before editing `### Highlights`, `### Changes`, or103 `### Fixes`; do not carry old grouped prose forward without re-auditing it104 - inspect linked PRs/issues or diffs for ambiguous commits. Direct commits105 are editorial input, not public ledger rows; infer material user outcomes106 from subject, body, touched files, tests, and nearby commits1071084. Rewrite one stable-base section only:109 - use `## YYYY.M.PATCH`110 - do not create beta-specific headings111 - do not leave a stale `## Unreleased` section above the target release112 - if `Unreleased` contains release-bound notes, fold them into the target113 section instead of deleting them1145. Section shape:115 - `### Highlights`: 5-8 bullets, broad user wins first116 - include only a clear user-visible capability or workflow unlock, a117 material reliability/safety fix, a broad cross-surface improvement, or118 a release-defining integration/compatibility milestone119 - every highlight must say what changed for a user in one sentence; use120 one user story per bullet and group its supporting PRs121 - exclude tests, CI, refactors, docs, catalog churn, and implementation122 detail unless the outcome is a material install/update, data-safety, or123 widely visible user improvement124 - `### Changes`: new capabilities and behavior changes125 - `### Fixes`: user-facing fixes first, grouped by impact and surface126 - group related changes/fixes by surface and user impact; avoid one bullet127 per tiny commit when several commits tell one user-facing story128 - `### Complete contribution record`: generated PR-first record after the129 grouped prose; it is the exhaustive accounting surface, not a second130 release summary1316. Preserve attribution:132 - keep `#issue`, `(#PR)`, `Fixes #...`, and `Thanks @...`133 - every human-authored merged PR represented by a user-facing entry needs134 its PR ref and `Thanks @author`, even when the PR had no linked issue135 - every human issue reporter for a `Fixes #...` or referenced bug issue136 represented by a user-facing entry needs `Thanks @reporter` unless the137 same handle is already thanked in that bullet138 - every human `Co-authored-by` contributor on represented user-facing work139 needs `Thanks @handle` when a GitHub handle is known140 - when grouping multiple PRs/issues in one bullet, include every relevant141 PR/issue ref and every human contributor handle in that same bullet142 - multiple `Thanks @...` handles in one bullet are expected; do not drop or143 collapse contributor credit just because the note is grouped144 - if one grouped bullet covers both direct commits and PRs, keep all PR refs145 and thanks, plus any issue refs and human credit from the direct work146 - issues remain normal inline `#NNN` references. Do not add a separate147 linked-issues inventory. The generated PR record keeps source issues148 inline as `Related #NNN` on the PR that shipped them149 - when backfilling an older linked-issues inventory, preserve reporter150 credit inline for every GitHub-confirmed closing PR relationship. Do not151 infer a PR relationship from a generic cross-reference event, invent an152 unrelated PR link for a standalone report, or recreate the retired153 inventory154 - the complete contribution record lists every merged source PR exactly once155 as `**PR #NNN**`; source PRs include GitHub commit associations and merged156 PR references explicitly present in active commit subjects/bodies. It157 preserves author/co-author credit and any issue references in the original158 title159 - the provenance arithmetic and unique total must match the rendered PR160 rows exactly; candidate validation rejects malformed or forged counts161 - direct commits remain in the manifest with GitHub-resolved author,162 co-author, issue, and editorial-eligibility data. They inform grouped163 prose but are never rendered as a public `#### Direct commits` dump. Add164 direct-commit credit to a grouped bullet only when it shares an explicit165 closing issue reference or at least two distinctive subject terms166 - the verifier rejects `docs`, `test`, `refactor`, `ci`, `build`, `chore`,167 and `style` PRs in Highlights, Changes, or Fixes. Keep those internal168 contributions in the complete PR record, but do not give them editorial169 release-note space170 - classify internal-only work from conventional prefixes and clear title171 signals such as `QA`, `test`, `docs`, `refactor`, `lint`, or `CI`; an172 untyped title is not automatically editorial173 - do not add GHSA references, advisory IDs, or security advisory slugs to174 changelog entries or GitHub release-note text unless explicitly requested175 - never thank bots, `@claude`, `@openclaw`, `@clawsweeper`, or `@steipete`176 - do not use GitHub's release contributor count as the source of truth; the177 changelog must carry the complete human credit set itself1787. Sorting preference:179 - security/data-loss and content-boundary fixes180 - transcript/replay/reply delivery correctness181 - channels and mobile integrations182 - providers/Codex/local model reliability183 - install/update/release path reliability184 - performance and observability185 - docs and contributor-only/internal details last or omitted1868. Keep bullets single-line unless existing file style forces otherwise. Avoid187 internal release-process noise unless it changes user install/update safety.1889. Check release-note side conditions:189 - inspect `src/plugins/compat/registry.ts`190 - inspect `src/commands/doctor/shared/deprecation-compat.ts`191 - if any compatibility `removeAfter` is on/before release date, resolve it192 or explicitly record the blocker before shipping19310. Validate and ship:194195- after the manifest-driven rewrite, regenerate and verify the complete196 contribution record before committing:197 ```bash198 node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \199 --base <base-tag> \200 --target <target-ref> \201 --main-ref origin/main \202 --version <YYYY.M.PATCH> \203 --manifest /tmp/openclaw-release-<YYYY.M.PATCH>.json \204 --write-ledger205 ```206- the command fails when any `#NNN` reference in release history or the207 rendered release section cannot resolve, when reverted work is presented208 as shipped, when a source PR is absent from the contribution record, when209 direct commits are rendered as a public record dump, when non-editorial210 PRs appear in grouped prose, or when an eligible PR author or known211 co-author is missing from that PR's `Thanks @...` credit. It also fails212 before history collection when `--base` is not an ancestor of `--target`,213 when `### Highlights` has fewer than five or more than eight top-level214 bullets, or when the existing prose/record names a PR outside the source215 range. Only an explicit `--seed-ref` may add historical PR inventory; an216 explicit repeatable `--shipped-ref` may subtract PRs proven present in a217 prior shipped tag218- when grouped prose names a PR, that same bullet must retain every219 contributor and linked-reporter credit from its generated PR record220- unqualified `#NNN` references resolve against `openclaw/openclaw`;221 cross-repository references such as `openclaw/imsg#141` remain literal222 text and must not be rewritten as local issue links223- after the GitHub release or prerelease is published, verify every matching224 release page against the same source section:225 ```bash226 node .agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs \227 --base <base-tag> \228 --target <target-ref> \229 --version <YYYY.M.PATCH> \230 --release-tag v<YYYY.M.PATCH> \231 --check-github232 ```233- add one `--release-tag` for every beta and stable page in the train; a234 `### Release verification` tail is permitted, but any other body drift235 fails the check236- `scripts/render-github-release-notes.mjs` is the canonical release-body237 renderer used by candidate validation, publish, and verification. When the238 complete `## YYYY.M.PATCH` section fits GitHub's 125,000-character limit and239 the renderer's matching 125,000-byte safety ceiling, the body must contain240 that exact section including its heading241- when the complete source section exceeds either limit, the renderer keeps the exact242 grouped editorial notes through the line before243 `### Complete contribution record`, then emits that heading with a stable244 link to the full contribution record in the tag-pinned `CHANGELOG.md`.245 Never truncate a bullet or partial record, and never hand-author a different246 compact form247- append `### Release verification` only when it fits after the canonical full248 or compact body is chosen. If it does not fit, omit the body tail and retain249 the immutable attached release evidence; never compact a fitting full250 contribution record just to preserve the optional tail251- `pnpm release:candidate` performs this deterministic render check from the252 exact tag before it dispatches Full Release Validation, including when local253 generated checks are explicitly skipped254- `git diff --check`255- for docs/changelog-only changes, no broad tests are required256- stage `CHANGELOG.md` and commit with `git commit -m "docs(changelog): refresh YYYY.M.PATCH notes"`257- record the new commit as the Release SHA and require258 `git diff --name-only <code-sha>..<release-sha>` to print only259 `CHANGELOG.md`260- push the release branch without rebasing it onto moving `main`261- dispatch SHA-pinned Full Release Validation for the Release SHA with evidence262 reuse enabled. It must select `changelog-only-release-v1`; any other changed263 path returns the release to the Code SHA validation loop264265## Extended-Stable Variant266267Extended-stable has one release commit and no GitHub Release body. After version268prep and approved backports, regenerate `## YYYY.M.P` with the regular manifest269and original-main-PR provenance rules. Land it by PR, then validate the final270branch tip before tagging. Re-audit after a product backport; a tooling-only271repair needs no changelog entry. Never rewrite a published tag or changelog.272273## Quota / API Outage Rule274275If GitHub API quota is exhausted, do not idle. Continue work that does not need276GitHub API:277278- local changelog rewrite and release-note extraction279- local pretag checks and package/build sanity280- git push/tag checks over git protocol281- npm registry `npm view` checks282- exact workflow-dispatch command preparation283284Only GitHub Release creation, workflow dispatch, run polling, artifact download,285and issue/PR mutation need API quota.