Problem
On success the row payloadHash is overwritten with sentinel 'processed' (src/queue/processors.ts:799); a GitHub redelivery carries the real hash → dedup (existing.payloadHash === payloadHash) is false → full reprocess. Gate ops are idempotent, but persistAdvisory / recordGithubProductUsage / audit events re-fire (double-counted usage/audit, re-pushed advisory).
Fix
Dedup on delivery-ID + status (processed) rather than payload hash, or persist the real hash through completion.
Acceptance
- Redelivery of a processed event is a no-op for usage/audit/advisory.
Problem
On success the row payloadHash is overwritten with sentinel 'processed' (src/queue/processors.ts:799); a GitHub redelivery carries the real hash → dedup (existing.payloadHash === payloadHash) is false → full reprocess. Gate ops are idempotent, but persistAdvisory / recordGithubProductUsage / audit events re-fire (double-counted usage/audit, re-pushed advisory).
Fix
Dedup on delivery-ID + status (processed) rather than payload hash, or persist the real hash through completion.
Acceptance