Add Stripe webhook idempotency guard to prevent duplicate payment processing #61

Closed
opened 2026-04-08 16:11:50 -04:00 by pook · 2 comments
Owner

Problem

Compliancebot #53 adds a Stripe webhook handler but without idempotency, duplicate webhook deliveries could unlock documents twice or corrupt payment state.

Implementation

  1. Add an idempotency_keys table: event_id TEXT PRIMARY KEY, processed_at TIMESTAMP DEFAULT NOW()
  2. At the top of the Stripe webhook handler, check if event.id already exists
  3. If found, return 200 immediately without reprocessing
  4. If new, insert event ID then process the payment event in a transaction
  5. Add scheduled cleanup of records older than 48 hours

Acceptance Criteria

  • Redelivered Stripe events return 200 without side effects
  • Unit test verifies idempotency with duplicate event IDs
  • Old idempotency records are purged automatically

Generated by CEO Planner (priority: 2)

## Problem Compliancebot #53 adds a Stripe webhook handler but without idempotency, duplicate webhook deliveries could unlock documents twice or corrupt payment state. ## Implementation 1. Add an `idempotency_keys` table: `event_id TEXT PRIMARY KEY, processed_at TIMESTAMP DEFAULT NOW()` 2. At the top of the Stripe webhook handler, check if `event.id` already exists 3. If found, return 200 immediately without reprocessing 4. If new, insert event ID then process the payment event in a transaction 5. Add scheduled cleanup of records older than 48 hours ## Acceptance Criteria - Redelivered Stripe events return 200 without side effects - Unit test verifies idempotency with duplicate event IDs - Old idempotency records are purged automatically --- *Generated by CEO Planner (priority: 2)*
Author
Owner

Bulk-closed 2026-04-10 during pipeline triage.

Context: CEO agent had created 100 open agent-task issues against compliancebot, largely duplicates of each other and of the 50 currently-open PRs. Root cause traced to a git-push race in agent-worker executor (dispatch jobs collided on branch agent/dispatch/* because jobId prefix truncated to literal "dispatch"). Fix deployed: runId is now threaded from Paperclip shim through /dispatch → TaskJob → executor, and branches are keyed on a 12-char unique run key.

What to do next:

  1. Triage the 50 open PRs at https://192.168.183.110:3000/pook/compliancebot/pulls — many are ready to merge
  2. CEO should halt new task creation until open PRs drop below 10
  3. Surviving kept issues: #313, #314, #315, #341, #342, #350, #351, #352 (PR review/merge tasks)

This issue was superseded, not abandoned. Reopen if still relevant after PR triage.

Bulk-closed 2026-04-10 during pipeline triage. **Context:** CEO agent had created 100 open agent-task issues against compliancebot, largely duplicates of each other and of the 50 currently-open PRs. Root cause traced to a git-push race in agent-worker executor (dispatch jobs collided on branch `agent/dispatch/*` because jobId prefix truncated to literal "dispatch"). Fix deployed: runId is now threaded from Paperclip shim through /dispatch → TaskJob → executor, and branches are keyed on a 12-char unique run key. **What to do next:** 1. Triage the 50 open PRs at https://192.168.183.110:3000/pook/compliancebot/pulls — many are ready to merge 2. CEO should halt new task creation until open PRs drop below 10 3. Surviving kept issues: #313, #314, #315, #341, #342, #350, #351, #352 (PR review/merge tasks) This issue was superseded, not abandoned. Reopen if still relevant after PR triage.
pook closed this issue 2026-04-10 14:48:30 -04:00
Author
Owner

Duplicate of #68 — consolidated stale issue cleanup

Duplicate of #68 — consolidated stale issue cleanup
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pook/compliancebot#61
No description provided.