mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-25 17:45:53 +01:00
The duplex broker forwarded each request and mapped a forward rejection to a retryable 502 when its controller was not aborted. A fetch can reject after the request bytes reach the host and the host commits a mutation, but before the response headers arrive. A retry then sent a new request id outside the broker deduplication set, so the host applied the mutation twice. The broker now classifies a non-aborted forward rejection by method safety. A safe method (GET, HEAD, OPTIONS, TRACE) never changes host state, so its rejection stays a retryable 502. Any other method may have committed, so the broker returns a non-retryable 504 and marks the outcome indeterminate. The in-sandbox gateway maps the indeterminate outcome to a terminal 409, so a caller never repeats a possibly-committed mutation. Add broker coverage for both paths. Co-authored-by: Paperclip <noreply@paperclip.ing>