Skip to content

[finding] the shipped objectQLProvider in rest-api-plugin.ts absorbs before the transport sees it — the #13476 repair does not reach the single-kernel wiring #13904

Description

@claude

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions