Help with BodyGyro and surface normal

I am making a parkour system and currently working on a wall climb system. I am practically finished but I need the character to face the wall so I used body gyro and the surface normal of the raycast. The problem is that the player doesn’t face the wall. I don’t really understand surface normal.

code:

function wallclimb()
	if trickval.Value == false then
		trickval.Value = true
		WCA:Play()
		local speed = math.sqrt(Root.Velocity.X^2 + Root.Velocity.Z^2)
		
		bpos.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
		bpos.P = 6750
		bpos.D = 700
		bpos.Position = Root.Position + Vector3.new(0,5 + partsize.Y - (partsize.Y * 0.9) + (speed * 0.3) ,0)
		
		gyro.MaxTorque = Vector3.new(0,14000,0)
		gyro.P = 14000
		**gyro.CFrame = CFrame.lookAt(gyro.Parent.Position, normal)**
		
		wait(0.6)
		
		WCA:Stop()
		bpos.MaxForce = Vector3.new(0,0,0)
		gyro.MaxTorque = Vector3.new(0,0,0)
		trickval.Value = false
	end
end

Any help would be appreciated, Thanks