Resilience4j circuit breaker: trip, stay open, half-open, recover
=================================================================
Config: slidingWindowSize=10, minimumNumberOfCalls=5, failureRateThreshold=50%, waitDurationInOpenState=2s

-- Phase 1: 6 calls against a dead downstream (only 6, to satisfy minimumNumberOfCalls=5) --
call 1 -> FALLBACK for order-1: DownstreamUnavailableException - payment-gateway rejected call #1  [breaker state=CLOSED]
call 2 -> FALLBACK for order-2: DownstreamUnavailableException - payment-gateway rejected call #2  [breaker state=CLOSED]
call 3 -> FALLBACK for order-3: DownstreamUnavailableException - payment-gateway rejected call #3  [breaker state=CLOSED]
call 4 -> FALLBACK for order-4: DownstreamUnavailableException - payment-gateway rejected call #4  [breaker state=CLOSED]
call 5 -> FALLBACK for order-5: DownstreamUnavailableException - payment-gateway rejected call #5  [breaker state=OPEN]
call 6 -> FALLBACK for order-6: CallNotPermittedException - CircuitBreaker 'paymentService' is OPEN and does not permit further calls  [breaker state=OPEN]

Breaker state after 6 failing calls: OPEN (downstream was actually called 5 times)

-- Phase 2: 3 more calls while OPEN — these must NOT reach the downstream --
call 7 -> FALLBACK for order-7: CallNotPermittedException - CircuitBreaker 'paymentService' is OPEN and does not permit further calls  [breaker state=OPEN, downstream calls so far=5]
call 8 -> FALLBACK for order-8: CallNotPermittedException - CircuitBreaker 'paymentService' is OPEN and does not permit further calls  [breaker state=OPEN, downstream calls so far=5]
call 9 -> FALLBACK for order-9: CallNotPermittedException - CircuitBreaker 'paymentService' is OPEN and does not permit further calls  [breaker state=OPEN, downstream calls so far=5]
Downstream call count unchanged (5) -- the breaker short-circuited all 3 calls without touching the downstream.

-- Phase 3: wait 2.2s for waitDurationInOpenState, downstream now recovers, probe with permittedNumberOfCallsInHalfOpenState=2 --
half-open probe 1 -> OK (call #1)  [breaker state=HALF_OPEN]
half-open probe 2 -> OK (call #2)  [breaker state=CLOSED]
Breaker state after 2 successful half-open probes: CLOSED
