The WebSocket surface.
Events are versioned (v1.write, v1.search) so a change that would break a
client can arrive as v2 with this one still answering. Every call goes
through the AgentDb facade, and every one answers -- a call that cannot be
served comes back as an error the client can act on, and the connection stays
usable afterwards.
A call deferred only because a model is still loading is reported distinctly from a call that failed, so a client retries the first rather than concluding the capability is gone.