The client-side webmentions.js was deduplicating by wm-id and source URL, but conversations API and webmention.io use different ID formats (string vs numeric). Add author URL + action type dedup to catch cross-source duplicates (e.g., same Bluesky like reported by both).