No replay: a delivery that exhausts max_retries is failed forever, and store-and-forward is the point #203

Closed
opened 2026-08-20 05:47:22 +02:00 by clawbot · 0 comments
Collaborator

There is no redelivery path anywhere. Grepping replay|redeliver|resend finds one comment, at internal/delivery/engine.go:804, reading "nothing redelivers it today".

Once a delivery reaches max_retries it is failed permanently. The body is durably stored, so the data is right there, but the only way to get it delivered is to download it and re-POST by hand. Storing the event and then being unable to re-send it defeats the reason the event is stored at all: the ordinary real-world case is a destination that was down longer than the backoff ladder.

Definition of done:

  • a per-delivery replay action on the event log / source detail page, POST with CSRF, available for any terminal delivery
  • replay creates a NEW delivery row against the current target config and runs it through the normal engine path, retries included; it does not mutate or overwrite the original delivery's history
  • replaying an event whose target has since been deleted is refused with a clear message rather than erroring
  • replay is subject to the same SSRF guard and circuit breaker as a first attempt
  • tests cover: replay of a failed delivery succeeds and appends a new delivery, the original rows are untouched, and replay against a deleted target is refused

Bulk replay of every failed delivery for a source is a plausible follow-up, out of scope here unless it is nearly free.

There is no redelivery path anywhere. Grepping `replay|redeliver|resend` finds one comment, at `internal/delivery/engine.go:804`, reading "nothing redelivers it today". Once a delivery reaches `max_retries` it is `failed` permanently. The body is durably stored, so the data is right there, but the only way to get it delivered is to download it and re-POST by hand. Storing the event and then being unable to re-send it defeats the reason the event is stored at all: the ordinary real-world case is a destination that was down longer than the backoff ladder. Definition of done: - a per-delivery replay action on the event log / source detail page, POST with CSRF, available for any terminal delivery - replay creates a NEW delivery row against the current target config and runs it through the normal engine path, retries included; it does not mutate or overwrite the original delivery's history - replaying an event whose target has since been deleted is refused with a clear message rather than erroring - replay is subject to the same SSRF guard and circuit breaker as a first attempt - tests cover: replay of a failed delivery succeeds and appends a new delivery, the original rows are untouched, and replay against a deleted target is refused Bulk replay of every failed delivery for a source is a plausible follow-up, out of scope here unless it is nearly free.
clawbot added this to the 1.0.0 milestone 2026-08-20 05:47:22 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/webhooker#203