Fetch resilience correctness matrix

2026-10-03T23:45:42.748Z - Node v24.21.0

Scenarioffetch 5.7.1ky 2.1.0fetch-retry 6.0.0ofetch 1.5.1wretch 3.0.9resilient-fetch-client 0.3.0fetch-smartly 1.0.2@resili/fetch 0.2.0-beta.1fetch-resilience 0.1.0flowshield 1.0.4ts-retry-circuit 2.1.1
Retry recoveryPASSPASSPASSPASSPASSPASSPASSPASSPASSPASSPASS
Retry exhaustionPASSPASSPASSPASSPASSPASSPASSPASSPASSPASSPASS
Zero retriesPASSPASSPASSPASSPASSPASSPASSPASSPASSPASSPASS
Retry + abort during backoffPASSPASSFAILFAILFAILFAILPASSFAILFAILPASSPASS
Bulkhead + queued abortPASSN/AN/AN/AN/AFAILN/AFAILFAILFAILN/A
Hedge + streaming bodyPASSN/AN/AN/AN/AN/AN/APASSN/APASSN/A
Circuit + hedge accountingPASSN/AN/AN/AN/AN/AN/APASSN/APASSN/A
Retry over real HTTPPASSPASSPASSPASSPASSPASSPASSPASSPASSPASSPASS
Timeout over real HTTPPASSPASSN/APASSPASSPASSPASSPASSPASSPASSPASS
Retry + total timeoutPASSPASSN/AN/AFAILFAILN/AN/AFAILFAILN/A
Retry + body replayPASSPASSPASSPASSPASSPASSPASSPASSPASSPASSPASS
Retry-After + abortPASSPASSN/AN/AN/AFAILPASSFAILN/AN/AN/A
Retry + throwing hooksPASSPASSPASSPASSFAILN/APASSPASSN/APASSPASS
Hedge + all branches failPASSN/AN/AN/AN/AN/AN/APASSN/APASSN/A
Hedge + timeoutPASSN/AN/AN/AN/AN/AN/APASSN/AFAILN/A
Dedupe + retryPASSN/AN/AN/APASSN/APASSFAILN/AN/AN/A
Dedupe + caller cancellationPASSN/AN/AN/APASSN/APASSPASSN/AN/AN/A
Bulkhead + retryPASSN/AN/AN/AN/APASSN/APASSPASSPASSN/A
Circuit + retry accountingPASSN/AN/AN/AN/APASSPASSPASSPASSPASSPASS
Circuit + half-open concurrencyFAILN/AN/AN/AN/APASSFAILPASSPASSPASSFAIL
Circuit + local cancellationPASSN/AN/AN/AN/AFAILPASSFAILFAILPASSPASS

122 passed, 25 failed, 0 skipped, 0 not run; 0 cells have no implemented test; 84 N/A.

N/A means this combination is unavailable; each cell explains why. NOT TESTED means unimplemented; NOT RUN means a registered case was absent from this run. Cells link to configurations, expected behavior, and failure details.

Case details

Retry recovery / ffetch - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / ky - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / fetch-retry - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / ofetch - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / wretch - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / resilient-fetch-client - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / fetch-smartly - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / @resili/fetch - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; maxAttempts=retries+1; circuit outside hedge

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / fetch-resilience - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / flowshield - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry recovery / ts-retry-circuit - PASS

Configuration: GET; two 503 responses then 200; 2 retries; delay 20ms; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: 200; body ready; exactly 3 attempts; no late attempts, active attempts or transport timers

Retry exhaustion / ffetch - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms

Expected: Exact HttpError; cause is a 503 Response with the original body; exactly 3 attempts; no transport timers

Retry exhaustion / ky - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms

Expected: Exact HTTPError; response.status is 503; exactly 3 attempts; no transport timers

Retry exhaustion / fetch-retry - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms

Expected: Return the final 503 Response with the original body; exactly 3 attempts; no transport timers

Retry exhaustion / ofetch - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms

Expected: Exact FetchError; status is 503; exactly 3 attempts; no transport timers

Retry exhaustion / wretch - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact WretchError constructor; status 503; exactly 3 attempts; no transport timers

Retry exhaustion / resilient-fetch-client - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact HttpError; cause responseStatus; details.status 503; exactly 3 attempts; no transport timers

Retry exhaustion / fetch-smartly - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact HttpError; status 503 and original error body; exactly 3 attempts; no transport timers

Retry exhaustion / @resili/fetch - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; maxAttempts=retries+1; circuit outside hedge

Expected: Exact RetryExceededError; ERR_RETRY_EXCEEDED; attempts and identical cause/lastError; exactly 3 attempts; no transport timers

Retry exhaustion / fetch-resilience - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms

Expected: Return the final 503 Response with the original body; exactly 3 attempts; no transport timers

Retry exhaustion / flowshield - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact RetryExhaustedError with attempts and HttpStatusError cause carrying response.status 503; with zero retries, exact underlying HttpStatusError; exactly 3 attempts; no transport timers

Retry exhaustion / ts-retry-circuit - PASS

Configuration: GET; three 503 responses; 2 retries; delay 20ms; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Exact Error constructor and HTTP 503 message from createCircuitFetch; exactly 3 attempts; no transport timers

Zero retries / ffetch - PASS

Configuration: GET; one 503; 0 retries

Expected: Exact HttpError; cause is a 503 Response with the original body; exactly 1 attempts; no transport timers

Zero retries / ky - PASS

Configuration: GET; one 503; 0 retries

Expected: Exact HTTPError; response.status is 503; exactly 1 attempts; no transport timers

Zero retries / fetch-retry - PASS

Configuration: GET; one 503; 0 retries

Expected: Return the final 503 Response with the original body; exactly 1 attempts; no transport timers

Zero retries / ofetch - PASS

Configuration: GET; one 503; 0 retries

Expected: Exact FetchError; status is 503; exactly 1 attempts; no transport timers

Zero retries / wretch - PASS

Configuration: GET; one 503; 0 retries; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact WretchError constructor; status 503; exactly 1 attempts; no transport timers

Zero retries / resilient-fetch-client - PASS

Configuration: GET; one 503; 0 retries; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact HttpError; cause responseStatus; details.status 503; exactly 1 attempts; no transport timers

Zero retries / fetch-smartly - PASS

Configuration: GET; one 503; 0 retries; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact HttpError; status 503 and original error body; exactly 1 attempts; no transport timers

Zero retries / @resili/fetch - PASS

Configuration: GET; one 503; 0 retries; maxAttempts=retries+1; circuit outside hedge

Expected: Exact RetryExceededError; ERR_RETRY_EXCEEDED; attempts and identical cause/lastError; exactly 1 attempts; no transport timers

Zero retries / fetch-resilience - PASS

Configuration: GET; one 503; 0 retries

Expected: Return the final 503 Response with the original body; exactly 1 attempts; no transport timers

Zero retries / flowshield - PASS

Configuration: GET; one 503; 0 retries; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact RetryExhaustedError with attempts and HttpStatusError cause carrying response.status 503; with zero retries, exact underlying HttpStatusError; exactly 1 attempts; no transport timers

Zero retries / ts-retry-circuit - PASS

Configuration: GET; one 503; 0 retries; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Exact Error constructor and HTTP 503 message from createCircuitFetch; exactly 1 attempts; no transport timers

Retry + abort during backoff / ffetch - PASS

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up

Expected: Exact AbortError; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Retry + abort during backoff / ky - PASS

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Retry + abort during backoff / fetch-retry - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after cancellation: expected 3 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:36:71
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 4 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:43:30
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / ofetch - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up

Expected: Exact FetchError with caller abort reason as cause; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:36:71
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 3 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:43:30
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / wretch - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:36:71
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 3 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:43:30
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / resilient-fetch-client - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:36:71
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 3 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:43:30
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / fetch-smartly - PASS

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Retry + abort during backoff / @resili/fetch - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; maxAttempts=retries+1; circuit outside hedge

Expected: Exact DOMException, identical caller abort reason forwarded by the fetch adapter; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / fetch-resilience - FAIL

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Cancellation must settle during backoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:29:68
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after cancellation: expected 3 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:36:71
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 4 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:43:30
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + abort during backoff / flowshield - PASS

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Retry + abort during backoff / ts-retry-circuit - PASS

Configuration: 2 retries; backoff 100ms; caller abort at 20ms; drain timers; healthy follow-up; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Exact CircuitAbortedError, CIRCUIT_ABORTED; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Bulkhead + queued abort / ffetch - PASS

Configuration: Capacity 1; queue 1; first request 100ms; queued caller abort at 20ms; replacement

Expected: Exact AbortError; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

Bulkhead + queued abort / ky - N/A

Configuration: Not applicable

Expected: No bulkhead queue is offered by this package.

Bulkhead + queued abort / fetch-retry - N/A

Configuration: Not applicable

Expected: No bulkhead queue is offered by this package.

Bulkhead + queued abort / ofetch - N/A

Configuration: Not applicable

Expected: No bulkhead queue is offered by this package.

Bulkhead + queued abort / wretch - N/A

Configuration: Not applicable

Expected: No bulkhead queue is offered by this package.

Bulkhead + queued abort / resilient-fetch-client - FAIL

Configuration: Capacity 1; queue 1; first request 100ms; queued caller abort at 20ms; replacement; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Queued cancellation must settle before slot handoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:64:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cancelled queue entry must release queue capacity: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:73:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 1 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:75:32
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Bulkhead + queued abort / fetch-smartly - N/A

Configuration: Not applicable

Expected: No bulkhead queue is offered by this package.

Bulkhead + queued abort / @resili/fetch - FAIL

Configuration: Capacity 1; queue 1; first request 100ms; queued caller abort at 20ms; replacement; maxAttempts=retries+1; circuit outside hedge

Expected: Exact DOMException, identical caller abort reason forwarded by the fetch adapter; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Queued cancellation must settle before slot handoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:64:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cancelled queue entry must release queue capacity: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:73:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected 1 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:75:32
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Bulkhead + queued abort / fetch-resilience - FAIL

Configuration: Capacity 1; queue 1; first request 100ms; queued caller abort at 20ms; replacement

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Queued cancellation must settle before slot handoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:64:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cancelled queue entry must release queue capacity: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:73:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected [ …(2) ] to not include 'https://example.test/resource/cancell…'
    at Proxy.<anonymous> (file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2077:15)
    at Proxy.<anonymous> (file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)
    at Proxy.methodWrapper (file:///home/runner/work/http-resilience/http-resilience/node_modules/chai/index.js:1737:25)
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:77:24
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Bulkhead + queued abort / flowshield - FAIL

Configuration: Capacity 1; queue 1; first request 100ms; queued caller abort at 20ms; replacement; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact DOMException, identical caller abort reason; prompt settlement; cancelled caller never dispatched again; replacement/follow-up succeeds; no leaked transport work

AssertionError: Queued cancellation must settle before slot handoff: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:64:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cancelled queue entry must release queue capacity: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:73:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected [ …(2) ] to not include 'https://example.test/resource/cancell…'
    at Proxy.<anonymous> (file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:2077:15)
    at Proxy.<anonymous> (file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/index.C4tKZ0yW.js:1944:14)
    at Proxy.methodWrapper (file:///home/runner/work/http-resilience/http-resilience/node_modules/chai/index.js:1737:25)
    at /home/runner/work/http-resilience/http-resilience/test/conformance/competitor-combinations.test.ts:77:24
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Bulkhead + queued abort / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: Capacity rejects immediately; no queued bulkhead is offered.

Hedge + streaming body / ffetch - PASS

Configuration: Primary hangs; hedge after 10ms; winning body chunks at +20ms and +40ms

Expected: Body winner readable to EOF; primary cancelled; exactly 2 attempts; no active attempts, bodies or transport timers

Hedge + streaming body / ky - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / fetch-retry - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / ofetch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / wretch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / fetch-smartly - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / @resili/fetch - PASS

Configuration: Primary hangs; hedge after 10ms; winning body chunks at +20ms and +40ms; maxAttempts=retries+1; circuit outside hedge

Expected: Body winner readable to EOF; primary cancelled; exactly 2 attempts; no active attempts, bodies or transport timers

Hedge + streaming body / fetch-resilience - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Hedge + streaming body / flowshield - PASS

Configuration: Primary hangs; hedge after 10ms; winning body chunks at +20ms and +40ms; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Body winner readable to EOF; loser result discarded as documented; caller abort cleans up the hanging loser; exactly 2 attempts; no remaining transport work

Hedge + streaming body / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / ffetch - PASS

Configuration: Circuit trips after one logical failure; hedge at 10ms; primary 503 at 15ms; winning hedge at 30ms; unhedged POST failure

Expected: Winner and next request succeed; threshold-crossing POST and subsequent refusal throw exact CircuitOpenError; exactly 4 attempts

Circuit + hedge accounting / ky - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / fetch-retry - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / ofetch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / wretch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / fetch-smartly - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / @resili/fetch - PASS

Configuration: Circuit trips after one logical failure; hedge at 10ms; primary 503 at 15ms; winning hedge at 30ms; unhedged POST failure; maxAttempts=retries+1; circuit outside hedge; POST hedges too; failed POST uses 2 attempts; same circuit instance throughout

Expected: Winner and follow-up succeed; hedged POST failure throws exact Error with message No acceptable hedged result completed.; next call exact CircuitOpenError; 5 transport attempts

Circuit + hedge accounting / fetch-resilience - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Circuit + hedge accounting / flowshield - PASS

Configuration: Circuit trips after one logical failure; hedge at 10ms; primary 503 at 15ms; winning hedge at 30ms; unhedged POST failure; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Winner and next request succeed; deliberate failure follows HTTP contract; next call throws exact CircuitOpenError; exactly 4 attempts

Circuit + hedge accounting / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No hedging policy is offered by this package.

Retry over real HTTP / ffetch - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / ky - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / fetch-retry - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / ofetch - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / wretch - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / resilient-fetch-client - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / fetch-smartly - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / @resili/fetch - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; maxAttempts=retries+1; circuit outside hedge

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / fetch-resilience - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / flowshield - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: 200; body ready; exactly 3 server arrivals

Retry over real HTTP / ts-retry-circuit - PASS

Configuration: Native fetch; loopback HTTP; 2 retries; delay 5ms; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: 200; body ready; exactly 3 server arrivals

Timeout over real HTTP / ffetch - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries

Expected: Exact TimeoutError; healthy follow-up succeeds

Timeout over real HTTP / ky - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries

Expected: Exact TimeoutError; healthy follow-up succeeds

Timeout over real HTTP / fetch-retry - N/A

Configuration: Not applicable

Expected: No timeout policy is offered; native fetch alone does not supply this deadline.

Timeout over real HTTP / ofetch - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries

Expected: Exact FetchError; exact Error cause named TimeoutError with code 23; healthy follow-up succeeds

Timeout over real HTTP / wretch - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact DOMException named AbortError from AbortAddon.setTimeout; healthy follow-up succeeds

Timeout over real HTTP / resilient-fetch-client - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact Cockatiel TaskCancelledError identifying timeout; healthy follow-up succeeds

Timeout over real HTTP / fetch-smartly - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact TimeoutError with timeout 100; healthy follow-up succeeds

Timeout over real HTTP / @resili/fetch - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; maxAttempts=retries+1; circuit outside hedge

Expected: Exact RetryExceededError (1 attempt); cause is exact TimeoutError, ERR_TIMEOUT, timeoutMs 100; healthy follow-up succeeds

Timeout over real HTTP / fetch-resilience - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries

Expected: Exact TimeoutError; healthy follow-up succeeds

Timeout over real HTTP / flowshield - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact TimeoutError; healthy follow-up succeeds

Timeout over real HTTP / ts-retry-circuit - PASS

Configuration: Native fetch; loopback HTTP; headers delayed 1000ms; per-request/attempt timeout 100ms; 0 retries; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Exact CircuitTimeoutError, CIRCUIT_TIMEOUT, timeoutMs 100; healthy follow-up succeeds

Retry + total timeout / ffetch - PASS

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

Retry + total timeout / ky - PASS

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

Retry + total timeout / fetch-retry - N/A

Configuration: Not applicable

Expected: No overall deadline encompassing retry/backoff is exposed by this fetch API; per-attempt timeout is a different contract.

Retry + total timeout / ofetch - N/A

Configuration: Not applicable

Expected: No overall deadline encompassing retry/backoff is exposed by this fetch API; per-attempt timeout is a different contract.

Retry + total timeout / wretch - FAIL

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

AssertionError: Deadline must cover backoff and subsequent attempts: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:24:86
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after original deadline: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:33:76
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + total timeout / resilient-fetch-client - FAIL

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

AssertionError: No dispatch after original deadline: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:33:76
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + total timeout / fetch-smartly - N/A

Configuration: Not applicable

Expected: No overall deadline encompassing retry/backoff is exposed by this fetch API; per-attempt timeout is a different contract.

Retry + total timeout / @resili/fetch - N/A

Configuration: Not applicable

Expected: No overall deadline encompassing retry/backoff is exposed by this fetch API; per-attempt timeout is a different contract.

Retry + total timeout / fetch-resilience - FAIL

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

AssertionError: No dispatch after original deadline: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:33:76
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cooperative work must stop: expected 1 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:34:73
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + total timeout / flowshield - FAIL

Configuration: 100ms overall deadline; 1 retry; backoff 300ms or 80ms with second attempt hanging; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact library timeout error; settle at 100ms; original budget preserved; no dispatch after deadline; cooperative work stops; healthy follow-up

AssertionError: No dispatch after original deadline: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:33:76
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Cooperative work must stop: expected 1 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-total-timeout.test.ts:34:73
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + total timeout / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No overall deadline encompassing retry/backoff is exposed by this fetch API; per-attempt timeout is a different contract.

Retry + body replay / ffetch - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / ky - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / fetch-retry - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / ofetch - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / wretch - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / resilient-fetch-client - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / fetch-smartly - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / @resili/fetch - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; maxAttempts=retries+1; circuit outside hedge

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / fetch-resilience - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / flowshield - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry + body replay / ts-retry-circuit - PASS

Configuration: Explicit POST retries; text, Request and one-shot stream bodies; first attempt consumes payload then returns 503; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Replayable payload identical on every attempt; supported Request/stream cloning works; unsupported replay fails explicitly with exact TypeError or documented wrapper; never silently empty

Retry-After + abort / ffetch - PASS

Configuration: 503 (429 for fetch-smartly); 1 retry; Retry-After seconds/date/invalid/large; documented delay caps; abort at 20ms

Expected: Correct header wait or documented cap/fallback; exact caller abort error; prompt settlement; no subsequent dispatch; no leftover transport timers

Retry-After + abort / ky - PASS

Configuration: 503 (429 for fetch-smartly); 1 retry; Retry-After seconds/date/invalid/large; documented delay caps; abort at 20ms

Expected: Correct header wait or documented cap/fallback; exact caller abort error; prompt settlement; no subsequent dispatch; no leftover transport timers

Retry-After + abort / fetch-retry - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry-After + abort / ofetch - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry-After + abort / wretch - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry-After + abort / resilient-fetch-client - FAIL

Configuration: 503 (429 for fetch-smartly); 1 retry; Retry-After seconds/date/invalid/large; documented delay caps; abort at 20ms; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Correct header wait or documented cap/fallback; exact caller abort error; prompt settlement; no subsequent dispatch; no leftover transport timers

AssertionError: Abort must interrupt header-derived wait: 1: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after header-wait cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:37:87
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: Thu, 01 Jan 1970 00:00:01 GMT: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after header-wait cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:37:87
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: bad: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after header-wait cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:37:87
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: 1000: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No dispatch after header-wait cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:37:87
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry-After + abort / fetch-smartly - PASS

Configuration: 503 (429 for fetch-smartly); 1 retry; Retry-After seconds/date/invalid/large; documented delay caps; abort at 20ms; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Correct header wait or documented cap/fallback; exact caller abort error; prompt settlement; no subsequent dispatch; no leftover transport timers

Retry-After + abort / @resili/fetch - FAIL

Configuration: 503 (429 for fetch-smartly); 1 retry; Retry-After seconds/date/invalid/large; documented delay caps; abort at 20ms; maxAttempts=retries+1; circuit outside hedge

Expected: Correct header wait or documented cap/fallback; exact caller abort error; prompt settlement; no subsequent dispatch; no leftover transport timers

AssertionError: Retry-After must control retry timing: 1: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:40:92
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: 1: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Retry-After must control retry timing: Thu, 01 Jan 1970 00:00:01 GMT: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:40:92
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: Thu, 01 Jan 1970 00:00:01 GMT: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: bad: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Retry-After must control retry timing: 1000: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:40:92
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: Abort must interrupt header-derived wait: 1000: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-after-abort.test.ts:30:85
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry-After + abort / fetch-resilience - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry-After + abort / flowshield - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry-After + abort / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No Retry-After handling is offered by this package.

Retry + throwing hooks / ffetch - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / ky - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / fetch-retry - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / ofetch - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / wretch - FAIL

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

AssertionError: callback: callback rejection must settle the caller: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-hook-error.test.ts:19:92
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: async-callback: callback rejection must settle the caller: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/retry-hook-error.test.ts:19:92
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Retry + throwing hooks / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No configurable retry predicate, delay function or retry callback is exposed.

Retry + throwing hooks / fetch-smartly - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / @resili/fetch - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback; maxAttempts=retries+1; circuit outside hedge

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / fetch-resilience - N/A

Configuration: Not applicable

Expected: No configurable retry predicate, delay function or retry callback is exposed.

Retry + throwing hooks / flowshield - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Retry + throwing hooks / ts-retry-circuit - PASS

Configuration: 503 then healthy response; 2 retries configured; throw/reject from supported predicate/delay/retry callback; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Sentinel error preserved by identity; one transport attempt; no late retry; same client accepts healthy follow-up

Hedge + all branches fail / ffetch - PASS

Configuration: Primary and one hedge after 10ms; distinct TypeErrors; completion at 20/60ms or 30/50ms; no retries

Expected: Two attempts; exact terminal error/cause: ffetch last RetryLimitError -> original TypeError, Resili last original error, flowshield primary original error; no leaked work

Hedge + all branches fail / ky - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / fetch-retry - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / ofetch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / wretch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / fetch-smartly - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / @resili/fetch - PASS

Configuration: Primary and one hedge after 10ms; distinct TypeErrors; completion at 20/60ms or 30/50ms; no retries; maxAttempts=retries+1; circuit outside hedge

Expected: Two attempts; exact terminal error/cause: ffetch last RetryLimitError -> original TypeError, Resili last original error, flowshield primary original error; no leaked work

Hedge + all branches fail / fetch-resilience - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + all branches fail / flowshield - PASS

Configuration: Primary and one hedge after 10ms; distinct TypeErrors; completion at 20/60ms or 30/50ms; no retries; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Two attempts; exact terminal error/cause: ffetch last RetryLimitError -> original TypeError, Resili last original error, flowshield primary original error; no leaked work

Hedge + all branches fail / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / ffetch - PASS

Configuration: Hedge delay 10ms; timeout 5/10/11/100ms; primary/hedge hang; no retries; healthy follow-up

Expected: Exact timeout error/wrapper; deadline settlement; no dispatch at/after deadline; cooperative branches stop; no late hedge; same client recovers

Hedge + timeout / ky - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / fetch-retry - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / ofetch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / wretch - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / fetch-smartly - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / @resili/fetch - PASS

Configuration: Hedge delay 10ms; timeout 5/10/11/100ms; primary/hedge hang; no retries; healthy follow-up; maxAttempts=retries+1; circuit outside hedge

Expected: Exact timeout error/wrapper; deadline settlement; no dispatch at/after deadline; cooperative branches stop; no late hedge; same client recovers

Hedge + timeout / fetch-resilience - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Hedge + timeout / flowshield - FAIL

Configuration: Hedge delay 10ms; timeout 5/10/11/100ms; primary/hedge hang; no retries; healthy follow-up; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact timeout error/wrapper; deadline settlement; no dispatch at/after deadline; cooperative branches stop; no late hedge; same client recovers

AssertionError: No late hedge at deadline 5: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:32:79
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:35:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: All cooperative branches must stop: expected 1 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:36:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: No late hedge at deadline 10: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:32:79
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:35:82
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: All cooperative branches must stop: expected 1 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:36:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: All cooperative branches must stop: expected 2 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:36:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: All cooperative branches must stop: expected 2 to be +0 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/hedge-timeout.test.ts:36:81
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Hedge + timeout / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No hedging policy is offered.

Dedupe + retry / ffetch - PASS

Configuration: 4 same-key GET callers; dedupe outside retry (Resili public policy order 150); two delayed 503s then streamed ready; 2 retries; delay 20ms; fresh same-key follow-up

Expected: Exactly 3 shared transport attempts; every caller settles with 200 and independently usable body; registry cleans up and follow-up dispatches once

Dedupe + retry / ky - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / fetch-retry - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / ofetch - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / wretch - PASS

Configuration: 4 same-key GET callers; dedupe outside retry (Resili public policy order 150); two delayed 503s then streamed ready; 2 retries; delay 20ms; fresh same-key follow-up; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exactly 3 shared transport attempts; every caller settles with 200 and independently usable body; registry cleans up and follow-up dispatches once

Dedupe + retry / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / fetch-smartly - PASS

Configuration: 4 same-key GET callers; dedupe outside retry (Resili public policy order 150); two delayed 503s then streamed ready; 2 retries; delay 20ms; fresh same-key follow-up; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exactly 3 shared transport attempts; every caller settles with 200 and independently usable body; registry cleans up and follow-up dispatches once

Dedupe + retry / @resili/fetch - FAIL

Configuration: 4 same-key GET callers; dedupe outside retry (Resili public policy order 150); two delayed 503s then streamed ready; 2 retries; delay 20ms; fresh same-key follow-up; maxAttempts=retries+1; circuit outside hedge

Expected: Exactly 3 shared transport attempts; every caller settles with 200 and independently usable body; registry cleans up and follow-up dispatches once

AssertionError: expected { ok: false, …(1) } to deeply equal { ok: true, value: 'ready' }
    at /home/runner/work/http-resilience/http-resilience/test/conformance/dedupe-retry.test.ts:25:69
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected { ok: false, …(1) } to deeply equal { ok: true, value: 'ready' }
    at /home/runner/work/http-resilience/http-resilience/test/conformance/dedupe-retry.test.ts:25:69
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: expected { ok: false, …(1) } to deeply equal { ok: true, value: 'ready' }
    at /home/runner/work/http-resilience/http-resilience/test/conformance/dedupe-retry.test.ts:25:69
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Dedupe + retry / fetch-resilience - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / flowshield - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + retry / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / ffetch - PASS

Configuration: Two same-key callers with distinct controllers; cancel follower/owner/all at 20ms; response at 100ms; fresh same-key follow-up

Expected: Exact ownership: ffetch follower detaches but owner abort cancels shared work; Resili subscribers detach independently, preserve the caller DOMException reason, and final detach aborts shared work; wretch/Smart DedupManager share owner's promise and ignore follower signal; no stranded caller; fresh call works

Dedupe + caller cancellation / ky - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / fetch-retry - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / ofetch - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / wretch - PASS

Configuration: Two same-key callers with distinct controllers; cancel follower/owner/all at 20ms; response at 100ms; fresh same-key follow-up; retry middleware resolves final response to Wretch HTTP handling; omit retry middleware for zero budget

Expected: Exact ownership: ffetch follower detaches but owner abort cancels shared work; Resili subscribers detach independently, preserve the caller DOMException reason, and final detach aborts shared work; wretch/Smart DedupManager share owner's promise and ignore follower signal; no stranded caller; fresh call works

Dedupe + caller cancellation / resilient-fetch-client - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / fetch-smartly - PASS

Configuration: Two same-key callers with distinct controllers; cancel follower/owner/all at 20ms; response at 100ms; fresh same-key follow-up; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact ownership: ffetch follower detaches but owner abort cancels shared work; Resili subscribers detach independently, preserve the caller DOMException reason, and final detach aborts shared work; wretch/Smart DedupManager share owner's promise and ignore follower signal; no stranded caller; fresh call works

Dedupe + caller cancellation / @resili/fetch - PASS

Configuration: Two same-key callers with distinct controllers; cancel follower/owner/all at 20ms; response at 100ms; fresh same-key follow-up; maxAttempts=retries+1; circuit outside hedge

Expected: Exact ownership: ffetch follower detaches but owner abort cancels shared work; Resili subscribers detach independently, preserve the caller DOMException reason, and final detach aborts shared work; wretch/Smart DedupManager share owner's promise and ignore follower signal; no stranded caller; fresh call works

Dedupe + caller cancellation / fetch-resilience - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / flowshield - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Dedupe + caller cancellation / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No request deduplication policy/helper is offered.

Bulkhead + retry / ffetch - PASS

Configuration: Capacity 1; queue 1; one retry; 100ms backoff; concurrent A/B; success and exhaustion; fresh C

Expected: Never exceed one transport attempt at once; ffetch holds the logical-request slot (A,A,B), others release during backoff (A,B,A); exact exhaustion outcome; no deadlock/leaked capacity

Bulkhead + retry / ky - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Bulkhead + retry / fetch-retry - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Bulkhead + retry / ofetch - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Bulkhead + retry / wretch - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Bulkhead + retry / resilient-fetch-client - PASS

Configuration: Capacity 1; queue 1; one retry; 100ms backoff; concurrent A/B; success and exhaustion; fresh C; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Never exceed one transport attempt at once; ffetch holds the logical-request slot (A,A,B), others release during backoff (A,B,A); exact exhaustion outcome; no deadlock/leaked capacity

Bulkhead + retry / fetch-smartly - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Bulkhead + retry / @resili/fetch - PASS

Configuration: Capacity 1; queue 1; one retry; 100ms backoff; concurrent A/B; success and exhaustion; fresh C; maxAttempts=retries+1; circuit outside hedge

Expected: Never exceed one transport attempt at once; ffetch holds the logical-request slot (A,A,B), others release during backoff (A,B,A); exact exhaustion outcome; no deadlock/leaked capacity

Bulkhead + retry / fetch-resilience - PASS

Configuration: Capacity 1; queue 1; one retry; 100ms backoff; concurrent A/B; success and exhaustion; fresh C

Expected: Never exceed one transport attempt at once; ffetch holds the logical-request slot (A,A,B), others release during backoff (A,B,A); exact exhaustion outcome; no deadlock/leaked capacity

Bulkhead + retry / flowshield - PASS

Configuration: Capacity 1; queue 1; one retry; 100ms backoff; concurrent A/B; success and exhaustion; fresh C; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Never exceed one transport attempt at once; ffetch holds the logical-request slot (A,A,B), others release during backoff (A,B,A); exact exhaustion outcome; no deadlock/leaked capacity

Bulkhead + retry / ts-retry-circuit - N/A

Configuration: Not applicable

Expected: No queued bulkhead is exposed; immediate capacity rejection is a different contract.

Circuit + retry accounting / ffetch - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / ky - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + retry accounting / fetch-retry - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + retry accounting / ofetch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + retry accounting / wretch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + retry accounting / resilient-fetch-client - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / fetch-smartly - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / @resili/fetch - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting; maxAttempts=retries+1; circuit outside hedge

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / fetch-resilience - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / flowshield - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + retry accounting / ts-retry-circuit - PASS

Configuration: Circuit threshold 2; 2 retries; repeated 503; explicit circuit outside retry except resilient-fetch-client/Resili native attempt accounting; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Attempt-counting circuits dispatch twice then refuse; logical-counting circuits permit 3 attempts per request and trip after 2 requests; exact trip-point and subsequent refusal errors

Circuit + half-open concurrency / ffetch - FAIL

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

AssertionError: late success must not close the newer open state: expected false to be true // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:129:59
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + half-open concurrency / ky - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + half-open concurrency / fetch-retry - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + half-open concurrency / ofetch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + half-open concurrency / wretch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + half-open concurrency / resilient-fetch-client - PASS

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

Circuit + half-open concurrency / fetch-smartly - FAIL

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

AssertionError: late success must not admit during the new cooldown: expected true to be false // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:132:93
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: late success must not consume the recovery response: expected 4 to be 3 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:134:88
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + half-open concurrency / @resili/fetch - PASS

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.; maxAttempts=retries+1; circuit outside hedge

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

Circuit + half-open concurrency / fetch-resilience - PASS

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

Circuit + half-open concurrency / flowshield - PASS

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

Circuit + half-open concurrency / ts-retry-circuit - FAIL

Configuration: Threshold 1; reset 100 ms; zero retries. Single probe, queued followers (Cockatiel), or unrestricted probes per contract. fetch-smartly public circuit helper wraps fetchWithRetry.; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: No dispatch before reset; admit at deadline; exact refusal errors; failed probes restart cooldown; late success cannot close a reopened circuit; healthy recovery.

AssertionError: admit at the exact reset deadline: expected 1 to be 2 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:56:72
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: new cooldown expires at its deadline: expected 2 to be 3 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:87:75
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: stale variant reset boundary: expected 2 to be 3 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:117:65
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: late success must not admit during the new cooldown: expected true to be false // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:132:93
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: late success must not consume the recovery response: expected 4 to be 3 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-half-open-concurrency.test.ts:134:88
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + local cancellation / ffetch - PASS

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

Circuit + local cancellation / ky - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + local cancellation / fetch-retry - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + local cancellation / ofetch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + local cancellation / wretch - N/A

Configuration: Not applicable

Expected: No circuit breaker policy/helper is offered.

Circuit + local cancellation / resilient-fetch-client - FAIL

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.; published backoff with initial/max delay configured; deterministic Math.random=0.5

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

AssertionError: backoff cancellation must settle promptly: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-local-cancellation.test.ts:67:79
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: no dispatch after backoff cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-local-cancellation.test.ts:71:84
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + local cancellation / fetch-smartly - PASS

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.; original parsed SmartFetchResponse result; normal timeout 60000ms

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

Circuit + local cancellation / @resili/fetch - FAIL

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.; maxAttempts=retries+1; circuit outside hedge

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

AssertionError: backoff cancellation must settle promptly: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-local-cancellation.test.ts:67:79
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + local cancellation / fetch-resilience - FAIL

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

AssertionError: backoff cancellation must settle promptly: expected undefined to be defined
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-local-cancellation.test.ts:67:79
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20
AssertionError: no dispatch after backoff cancellation: expected 2 to be 1 // Object.is equality
    at /home/runner/work/http-resilience/http-resilience/test/conformance/circuit-local-cancellation.test.ts:71:84
    at file:///home/runner/work/http-resilience/http-resilience/node_modules/vitest/dist/chunks/run.BTlFXlnv.js:2783:20

Failure trace

Circuit + local cancellation / flowshield - PASS

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.; HTTP operation throws HttpStatusError; circuit outside hedge; retry omitted for zero budget

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.

Circuit + local cancellation / ts-retry-circuit - PASS

Configuration: Reset 10000 ms. Active-fetch variant: threshold 1, no retries. Backoff variant: threshold 2, one retry, delay 100 ms; count preceding 503 at declared attempt/logical boundary.; public createCircuitFetch; full-jitter exponential backoff; deterministic Math.random=0.5 in scripted tests

Expected: Exact abort error/reason; prompt settlement and no late dispatch. Abort excluded as failure by classified circuits (Resili still records a nonfailure sample in its rate window); generic all-error policies and fetch-smartly public helper count it. Trip at the exact remaining real-failure budget; exact refusal; healthy recovery.