@loltrol2121’s reply fixes the bug. If you are not aware, the axis order in ToEulerAngle() is important! You’ll get completely different pitch (X) yaw (Y) and roll (Z) amounts based on the order of axes rotation. In your case you’d prioritize yaw, so it should be pulled before pitch or roll via ToEulerAnglesYXZ().
Also, these calculations are redundant: CFrame.new(0,0,0) * rotation → rotation math.rad(math.deg(Y)) → Y
-- Fixed
local _, Y, _ = Camera.CFrame:ToEulerAnglesYXZ()
LeanOrientation.CFrame = CFrame.Angles(0, Y, math.rad(15))
local y = Camera.Orientation.Y
LeanOrientation.CFrame = CFrame.new(0,0,0) * CFrame.Angles(0, math.rad(y), math.rad(15))
From what I search, toEulerAngles sometimes return a different x, y, z that makes 1 rotation. Like, many different x, y, z rotation could give same exact rotation. Orientation tells exactly for example: an object is facing 45 degrees right, 90 degrees down, and 10 degrees clockwise.