From 48c2b87048c5e87c580ca5d3fc9aa2d7c8dae55f Mon Sep 17 00:00:00 2001 From: Shuhui Luo <107524008+shuhuiluo@users.noreply.github.com> Date: Tue, 9 Dec 2025 14:15:37 -0500 Subject: [PATCH] fix: skip synthetic thread replies when anchor doesn't exist MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prevents duplicate messages when creating retroactive anchors for closed/reopened PRs. The synthetic thread reply (e.g., "PR Merged") is now skipped if no anchor exists - the subsequent edit action will create the retroactive anchor instead. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/services/message-delivery-service.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/services/message-delivery-service.ts b/src/services/message-delivery-service.ts index 666eaf4..1f6c6a6 100644 --- a/src/services/message-delivery-service.ts +++ b/src/services/message-delivery-service.ts @@ -78,6 +78,23 @@ export class MessageDeliveryService { )) ?? undefined) : undefined; + // Skip synthetic thread replies (closed/reopened) when anchor doesn't exist + // These have githubEntityType === parentType (e.g., "pr" for PR close event) + // Real entities like comments have different types (e.g., "comment" with parent "pr") + // (Retroactive anchor will be created by subsequent "edit" action) + if ( + action === "create" && + entityContext && + !entityContext.isAnchor && + entityContext.githubEntityType === entityContext.parentType && + !threadId + ) { + console.log( + `Skipping thread reply for ${entityContext.githubEntityType}:${entityContext.githubEntityId} - no anchor exists` + ); + return; + } + switch (action) { case "delete": if (!entityContext) {