Shouldn't you instead put the fragment normal into homogeneous space and then multiply it with the world transform, like this:

    vec4 transformedHomoNormal = normalize(worldTransform * vec4(fragNormal, 1.0));
    vec3 transformedNormal = transformedHomoNormal.xyz / transformedHomoNormal.w;