Context
GitHub may redeliver webhooks. Idempotency today relies on (program_id, pr_number) in payouts, but duplicate deliveries before payout insert can cause unnecessary RPC attempts.
Problem
Replayed deliveries add load and noisy error logs. The roadmap risk register calls for raw event persistence and replay safety.
Proposed scope
- Add unique index on
webhook_events.delivery_id when present
- Short-circuit processing when delivery id was already processed
- Store delivery id on all webhook ingestion paths (ignored, failed, processed)
Acceptance criteria
References
crates/gateway/src/routes.rs
crates/gateway/src/attestation.rs (persist_webhook_event)
migrations/001_init.sql
docs/ROADMAP.md risk register
Context
GitHub may redeliver webhooks. Idempotency today relies on
(program_id, pr_number)in payouts, but duplicate deliveries before payout insert can cause unnecessary RPC attempts.Problem
Replayed deliveries add load and noisy error logs. The roadmap risk register calls for raw event persistence and replay safety.
Proposed scope
webhook_events.delivery_idwhen presentAcceptance criteria
X-GitHub-Deliveryreturns 200 with statusduplicatewithout re-attestingReferences
crates/gateway/src/routes.rscrates/gateway/src/attestation.rs(persist_webhook_event)migrations/001_init.sqldocs/ROADMAP.mdrisk register