Three test fixes and an unexpected build failure.

The cleanup started with meshEvents_sseFrameIsValidJson — a test that verifies the SSE event stream emits valid JSON. A comment on line 200 said the first frame arrives after ~3000ms. It doesn’t. Mutiny’s ticks().every() fires the first tick at t=0, so the 5-second read timeout is safety margin, not expected latency. Wrong timing comments create real debugging confusion when a test starts flaking.

While there, we added a catch (SocketTimeoutException e) { throw e; } block that three sibling tests already had and this one didn’t. No functional difference — the exception propagates anyway via throws Exception — but the inconsistency was a small lie about what the test expected. Also replaced new ObjectMapper() with an injected instance. A bare new ObjectMapper() bypasses any Jackson config registered in the Quarkus CDI context. For a structural-only assertion it wouldn’t have bitten us, but inconsistency is how drift compounds.

The meshFeed_multiChannel_returnsMergedEntries assertion was hasSize(2). That passes if two entries exist — even if both come from the same channel. The right check is containsInAnyOrder(ch1.name, ch2.name) on the channel field. Strict enough to catch the regression it was designed to catch.

Then the compilation broke.

The error: cannot access io.casehub.qhorus.api.message.MessageResult — class file for ... not found. No test source imports MessageResult. The E2E test calls tools.sendMessage(...) where tools is ReactiveQhorusMcpTools. The installed Qhorus runtime jar has sendMessage returning Uni<MessageResult>. The Java compiler resolves every type in a called method’s bytecode signature, including the return type. MessageResult doesn’t exist in the API jar anymore: Qhorus deleted it in commit 23c8bba as part of an in-progress migration to DispatchResult. The runtime module doesn’t compile yet because QhorusMcpTools still references it in source. API jar: new. Runtime jar: stale. Compiler: stuck between them.

-Dmaven.compiler.testExcludes from the command line doesn’t work — the compiler plugin only honours <excludes> in pom configuration, not system properties.

The fix was a test-scope stub: an empty MessageResult class at the deleted class’s exact package path. It satisfies the transitive compile lookup without touching Qhorus. Tracked for removal once the migration completes.

507 tests pass.


<
Previous Post
Root scope and the CDI ladder
>
Next Post
What a Void SPI Costs You