{"repo":"NousResearch/hermes-agent","public_id":"7448","display_label":"Webhook intake idempotency and fan-out scoping fixes","summary":"These issues and pull requests address problems with webhook idempotency keying and deduplication logic that caused multi-route fan-out scenarios to incorrectly skip valid deliveries. The work focuses on scoping idempotency and dedup per route rather than globally by delivery ID alone.","subsystem":"gateway","counts":{"members":7,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":5},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":130692},"resolution":{"state":"resolved","by":"pr-130692"},"freshness":{"state":"verified","last_verified_at":"2026-10-01T19:37:33+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.2857142857142857},"fix_edges":[{"issue_number":7448,"pr_number":130692,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":7448,"title":"Webhook idempotency is keyed only by delivery ID, so the second route is skipped in valid multi-route fan-out","url":null,"state":"closed"},{"kind":"pr","number":7471,"title":"fix(webhook): scope idempotency per route","url":null,"state":"closed","close_reason":{"category":"volume_quota","implication":"active"},"merged":false},{"kind":"pr","number":33321,"title":"fix(webhook): scope GitHub delivery dedup by route","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#24633","number":24633},{"kind":"pr","value":"#7448","number":7448},{"kind":"pr","value":"#24633","number":24633}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":85618,"title":"fix(webhook): make intake fan-out-safe and structurally valid (Webhook Revolution)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#85523","number":85523}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":90236,"title":"fix(webhook): close Task 10 intake identity and raw-bound contracts","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"bd3fd0ed75084994fd9662019385bc773c69e097","number":0},{"kind":"commit","value":"c30ac90a92097058ddd6f9db3fa2e3182a7bfdcc","number":0},{"kind":"pr","value":"#97083","number":97083},{"kind":"pr","value":"#97083","number":97083},{"kind":"pr","value":"#97083","number":97083}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":106922,"title":"fix(webhook): scope delivery idempotency keys by route","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"5a8dea85fb","number":0},{"kind":"pr","value":"#7448","number":7448},{"kind":"pr","value":"#130692","number":130692},{"kind":"pr","value":"#130692","number":130692}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":130692,"title":"fix(gateway): webhook deliveries on different routes or profiles no longer drop each other as duplicates (#7448, salvage #129626)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/webhook.py","tests/gateway/test_webhook_adapter.py","tests/gateway/test_webhook_integration.py","website/docs/guides/webhook-github-pr-review.md","website/docs/user-guide/messaging/webhooks.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}