Found while implementing #13476 (the data-engine seam keeping "unresolvable" and "unwired" apart). Recorded for triage; no severity asserted.
The shape
#13476 repaired RestServer.computeExecCtx so a data-engine seam that is WIRED and FAILS raises the loud outage instead of resolving to the same undefined an UNWIRED embedder produces. The transport now takes the wiring fact from the provider's presence, and a provider that rejects is the outage.
That repair reaches any host that wires objectQLProvider itself. It does NOT reach the shipped single-kernel wiring, because the provider rest-api-plugin.ts hands over absorbs the failure one layer earlier:
const objectQLProvider = async (_environmentId?: string): Promise[IObjectQLEngine | undefined] => {
try {
return ctx.getService[IObjectQLEngine]('objectql');
} catch { return undefined; }
};
So in that wiring the provider never rejects — it RESOLVES undefined for both facts, and undefined is (correctly, per the seam contract) read downstream as "no engine". The two facts are collapsed before the repaired seam is reached.
Why this was not folded into #13476
That card's scope was pinned to the transport seam, and the correct behaviour here is not mechanical. ctx.getService throws for THREE distinguishable conditions, and the plugin currently treats all three alike:
[Kernel] Service 'objectql' not found — genuinely unregistered, the supported no-data-plane embedder shape;Service 'objectql' is async - use await — registered as a factory, wrong accessor;- anything the factory itself threw — a real resolution failure.
Only the first is "no engine is wired". Separating them is a judgement about which conditions this provider should re-raise, which is why it is filed rather than folded in.
Related, and distinct
Generated by Claude Code
Found while implementing #13476 (the data-engine seam keeping "unresolvable" and "unwired" apart). Recorded for triage; no severity asserted.
The shape
#13476 repaired
RestServer.computeExecCtxso a data-engine seam that is WIRED and FAILS raises the loud outage instead of resolving to the sameundefinedan UNWIRED embedder produces. The transport now takes the wiring fact from the provider's presence, and a provider that rejects is the outage.That repair reaches any host that wires
objectQLProvideritself. It does NOT reach the shipped single-kernel wiring, because the providerrest-api-plugin.tshands over absorbs the failure one layer earlier:So in that wiring the provider never rejects — it RESOLVES
undefinedfor both facts, andundefinedis (correctly, per the seam contract) read downstream as "no engine". The two facts are collapsed before the repaired seam is reached.Why this was not folded into #13476
That card's scope was pinned to the transport seam, and the correct behaviour here is not mechanical.
ctx.getServicethrows for THREE distinguishable conditions, and the plugin currently treats all three alike:[Kernel] Service 'objectql' not found— genuinely unregistered, the supported no-data-plane embedder shape;Service 'objectql' is async - use await— registered as a factory, wrong accessor;Only the first is "no engine is wired". Separating them is a judgement about which conditions this provider should re-raise, which is why it is filed rather than folded in.
Related, and distinct
Generated by Claude Code