The ordered subscriber's drain loop (emptyInFlightQueueIfWeCan) calls
onNext for every completed CF in a while loop. With per-element
executors, multiple CFs can complete concurrently, so the drain loop
calls onNext multiple times on the same thread — the TCK flags this as
a spec303 (unbounded recursion) violation.
Fix: use a shared single-thread executor per publisher instead of a new
executor per element. This ensures CFs complete sequentially, so when
the drain loop runs on the executor thread, no other CFs can complete
(they're queued behind it), and the loop only processes one item.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Summary
Test plan
🤖 Generated with Claude Code