Hi,
First of all, thanks for sharing your ggx implementation !
There seems to be an error in your halfvec computation.
You've written it as the substraction of the view by the lightdir (vec3 H = normalize(L - V);) but it should the addition of the two.
Regards