class DenseIndex Every verb is a batch over a RowsView, so a single vector is a one-row matrix. The breadth of the candidates rides each call rather than the handle, which lets a recall sweep run against one immutable index with no mutation between points.
The receiver chooses where a verb runs, and the verb stays the same: called on the index it runs on the caller's own thread, on On it blocks on that executor, and on Deferred it submits there and answers a Deferred<TResult>. The executor's kind must match the residency of the handle.
A handle may be shared across threads, and no method here takes a lock: every output whose length scales with the call lands in an Arena the caller lends. On a RAM handle, insertions and searches overlap freely: searches read only entries published behind the visibility watermark and never write to the graph, while insertions synchronize through per-node locks and publish in order. Serialization is the one exception, demanding a mutation-free window, though concurrent readers keep searching throughout.