block-wise approximate nearest-neighbour builder for the streaming pipeline.
the dense SVD embeddings are read in blocks, wrapped as TagVector and passed to ApproximateNearNeighbor.FindNeighbors(). because the approximate index is built per-block the working set stays at one block's worth of points instead of all m rows. produced directed neighbour lists are symmetrised (u-v saved once) and streamed to disk as undirected edge triples so the Louvain stage can consume them without re-reading the embedding matrix.