I have tried to dig into the sci-py code used by sph_harm . It seems it calls the lpmv function, which unluckily is a wrapper for the LPMV routine here
github.com/scipy/scipy/blob/main/scipy/special/specfun/… , which is written in FORTRAN77... I tried to decipher it for a while but unluckily I'm at a complete loss in FORTRAN. So hard to say exactly what recursive relationship they use to calculate the Legendre polynomials (which in turn would allow to verify normalization)