The jitter-spread scenario used millisecond-bucketed wall-clock
timestamps to assert that retried operations did not cluster. On busy
CI runners — especially when a preceding scenario's time.sleep patch
leaked through a late cleanup — tenacity's retry waits became no-ops
and all five operations landed in the same millisecond bucket, tripping
the max_in_bucket <= 3 assertion.
Three hardening changes:
1. Jitter test: switch from time.time() to time.monotonic_ns() and
replace the fragile bucket assertion with a unique-timestamp count
(>= 2 distinct readings among 5 sequential operations).
2. Timeout test: eagerly restore time.sleep in a try/finally block so
subsequent scenarios never observe the patched no-op, regardless of
behave's cleanup ordering.
3. Async circuit breaker: lower recovery_timeout from 0.2 s to 0.1 s
(the sleep step already waits 0.2 s) to give a wider safety margin
on slow CI machines.