Stable radix sort in-place using O(1) space
Yes, your radix sort appears to be correct, and runs in O(k n) time.

bucket_max_index is written to, but otherwise never used.  You can eliminate it completely.

Before the creation of the temp vector, you set index = 0.  It would be clearer to change that to assert(index == 0), since that should have been the result of v.size() - Σ bucket[i] in the previous loop.