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 da233beac773..7a7a37c6d3c9 100644
--- a/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs
+++ b/.agents/skills/openclaw-changelog-update/scripts/verify-release-notes.mjs
@@ -684,7 +684,7 @@ export function contributionRecordTarget(section) {
}
export function pullRequestTitleFromCommitSubject(subject, number) {
- const match = subject.match(/^(?
\S(?:.*\S)?) \(#(?[1-9]\d*)\)$/u);
+ const match = subject.match(/^(?\S(?:.*?\S)?)(? \(#(?[1-9]\d*)\))\k*$/u);
return match?.groups?.number === String(number) ? match.groups.title : undefined;
}
diff --git a/test/scripts/verify-release-notes.test.ts b/test/scripts/verify-release-notes.test.ts
index 312e2ff9a745..e7c80e9a024b 100644
--- a/test/scripts/verify-release-notes.test.ts
+++ b/test/scripts/verify-release-notes.test.ts
@@ -59,8 +59,12 @@ describe("release-note verification", () => {
it("accepts only canonical commit PR suffixes", () => {
expect(pullRequestTitleFromCommitSubject("Fix status (#102147)", 102147)).toBe("Fix status");
+ expect(pullRequestTitleFromCommitSubject("Fix status (#102147) (#102147)", 102147)).toBe(
+ "Fix status",
+ );
expect(pullRequestTitleFromCommitSubject("Fix status(#102147)", 102147)).toBeUndefined();
expect(pullRequestTitleFromCommitSubject("Fix status (#0102147)", 102147)).toBeUndefined();
+ expect(pullRequestTitleFromCommitSubject("Fix status (#0)", 0)).toBeUndefined();
expect(pullRequestTitleFromCommitSubject(" Fix status (#102147)", 102147)).toBeUndefined();
expect(pullRequestTitleFromCommitSubject("Fix status (#102147) ", 102147)).toBeUndefined();
expect(pullRequestTitleFromCommitSubject("Fix status (#102148)", 102147)).toBeUndefined();