RefineReport report = index.On(pool).Refine(expansionFactor: 256);Refinement re-selects the neighbors of every stored entry against the finished graph, improving edges that were chosen when the graph around them was still incomplete.
It is a build step rather than a repair: a cheap insertion pass followed by one refinement reaches a better graph, in less total time, than a single expensive insertion pass, so a wide expansion factor belongs here rather than in Insert.
The return is a RefineReport of the nodes re-selected and Changed, the islands found and reconnected, and the Reachability audit closing the heal; Changed at zero means the graph has settled, so a caller under a time budget loops until it falls below whatever rate it considers settled.
Searches may run throughout.
§ Absorbing & Splitting
index.On(pool).Absorb(donor);
index.On(pool).Split([left, right], seed: 7); // two empty receivers take a part eachBigger indexes come from absorbing, never mutating: Absorb appends each donor in turn, keeping its graph and linking it in across the appended part.
Every donor it absorbs is consumed and then refuses every verb with Status.Uninitialized, while one it did not absorb, like a donor of another scalar refused with Status.ConfigMismatch, stays a live index you still own, though its entries may already have moved. Split is its inverse, partitioning the entries along the graph into empty receivers and leaving the source empty and live; both answer a RefineReport of their closing refinements.