fix(slackbot): dedupe Slack messages by message identity#16
Merged
Conversation
…ent ID Slack can deliver the same user message as both an app_mention and a message event with distinct event IDs. Deduping on event ID alone let both through, producing duplicate DM handoffs and workflow runs. slackDedupKeys now emits a message-identity key (team:channel:ts) ahead of the event-ID key for message/app_mention callbacks, and EventDeduper.checkAndRememberAll rejects a batch if any key is still live, collapsing the duplicate delivery into one. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Slack can deliver the same user message as both an
app_mentionand amessageevent, each with a distinctevent_id. Deduping onevent_idalone let both through, producing duplicate DM workflow handoffs and duplicate workflow runs.Change
slackDedupKeys()now emits a message-identity key (message:team:channel:ts) ahead of the event-ID key formessage/app_mentioncallbacks. Non-message events (e.g.app_home_opened) keep event-ID-only dedup.EventDeduper.checkAndRememberAll()rejects a batch if any key is still live, collapsing a double-delivery into a single handoff.slackDedupKey→slackDedupKeys+checkAndRememberAll.Tests
dedup.test.tscases: batch rejection when any key is live; message-identity precedence over event ID.index.test.ts: anapp_mention+messagepair for the same thread now produces exactly one DM root post and one workflow run; the second delivery returns{ ok: true, duplicate: true }.All 9 slackbot dedup/index tests pass.
FORK.md updated per fork policy.
🤖 Generated with Claude Code