From 6bc06abbfb682f7575c920eb0ab59f0cfd18fa2c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 27 Jul 2026 19:24:47 -0400 Subject: [PATCH] fix(release): exclude automation changelog credit (#114788) * fix(release): exclude automation changelog credit * fix(ci): repair release-note verifier gates --- .../scripts/verify-release-notes.mjs | 12 ++++++++++-- test/external-script-modules.d.ts | 1 + test/scripts/verify-release-notes.test.ts | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs b/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs index 90c917b1fa88..412b1e282b13 100644 --- a/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs +++ b/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs @@ -24,7 +24,15 @@ const repo = "openclaw/openclaw"; const githubSnapshotSchemaVersion = 1; const githubSnapshotCheckpointInterval = 25; const commitAssociationQueryBatchSize = 20; -const excludedHandles = new Set(["openclaw", "clawsweeper", "claude", "codex", "steipete"]); +const excludedHandles = new Set([ + "openclaw", + "clawsweeper", + "claude", + "codex", + "hugin-bot", + "steipete", + "steipete-oai", +]); const nonEditorialTypes = new Set([ "build", "chore", @@ -405,7 +413,7 @@ function escapeRegExp(value) { return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); } -function isEligibleHandle(handle) { +export function isEligibleHandle(handle) { return ( typeof handle === "string" && handle.toLowerCase() !== "undefined" && diff --git a/test/external-script-modules.d.ts b/test/external-script-modules.d.ts index 82619f989df4..9aefd53cc4da 100644 --- a/test/external-script-modules.d.ts +++ b/test/external-script-modules.d.ts @@ -173,6 +173,7 @@ declare module "*openclaw-changelog-update/scripts/verify-release-notes.mjs" { }; export function countTopLevelSectionBullets(sectionSource: string, heading: string): number; export function highlightCountError(sectionSource: string): string | undefined; + export function isEligibleHandle(handle: string): boolean; export function ledgerChecks(...args: unknown[]): string[]; } diff --git a/test/scripts/verify-release-notes.test.ts b/test/scripts/verify-release-notes.test.ts index ef7b30bc8168..61cec92ef9a6 100644 --- a/test/scripts/verify-release-notes.test.ts +++ b/test/scripts/verify-release-notes.test.ts @@ -15,6 +15,7 @@ import { defaultGithubSnapshotPath, githubApiWithSnapshot, highlightCountError, + isEligibleHandle, persistGithubSnapshot, pullRequestTitleFromCommitSubject, releaseNoteReferences, @@ -48,6 +49,13 @@ function git(cwd: string, args: string[]): string { } describe("release-note verification", () => { + it("excludes maintainer and automation identities from contributor credit", () => { + expect(isEligibleHandle("human-contributor")).toBe(true); + expect(isEligibleHandle("steipete")).toBe(false); + expect(isEligibleHandle("steipete-oai")).toBe(false); + expect(isEligibleHandle("hugin-bot")).toBe(false); + }); + it("accepts only canonical commit PR suffixes", () => { expect(pullRequestTitleFromCommitSubject("Fix status (#102147)", 102147)).toBe("Fix status"); expect(pullRequestTitleFromCommitSubject("Fix status(#102147)", 102147)).toBeUndefined();