diff options
| author | Danilo M. <danix@danix.xyz> | 2026-09-08 12:57:32 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-09-08 12:57:32 +0200 |
| commit | 9ac5e7485e5f53f089c8932a8b13bc725b1ba029 (patch) | |
| tree | 1aeff544110ee79328544f08f14686c2f9aa8115 /.gitignore | |
| parent | 2ebc10f4e5e6e54e54cec5420d8fbba61c0a501a (diff) | |
| download | abusectl-9ac5e7485e5f53f089c8932a8b13bc725b1ba029.tar.gz abusectl-9ac5e7485e5f53f089c8932a8b13bc725b1ba029.zip | |
spec: retry deferred destinations from cron, not by hand
A rate limit tells us when, not merely that: a 429 carries Retry-After or
the vendor's reset headers. Recording the deadline and asking the user to
run submit again throws that away and relies on them remembering.
So `abusectl retry` scans every case for destinations whose retry_after
has passed and sends only those, as one unattended cron line beside
mailsync.sh. No inline retry: submit never sleeps waiting for a window,
because a daily quota resets in hours and a process killed while
sleeping is back to the user remembering. One mechanism, not two.
Unattended retry makes three properties load-bearing, since a retry that
re-sends is a duplicate abuse report and cannot be withdrawn. Status is
written before the attempt, so a crash mid-send leaves in-flight, which
is honest, rather than looking like it never happened; retry never
touches in-flight. Attempts are capped, so a dead abuse mailbox stops
being retried. A soft failure with no server deadline gets exponential
backoff.
deferred and failed are separate statuses: deferred means the tool will
handle it, failed means the user must. Collapsing them either strands a
rate-limited report forever or retries a dead mailbox indefinitely.
The qtmaildir dialog accordingly grows no retry button. A deferred
destination belongs to cron, and a button beside it would race the
scheduled run.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KphFXTc2QajxXsHWyvGJ4R
Diffstat (limited to '.gitignore')
0 files changed, 0 insertions, 0 deletions
