3D Movement Glitching: Slipping through terrain and flying off

I'm about to transfer the data defining my UFO player object to a scriptable object, but I'd like to fix the glitching before I take the last few steps. Clip of glitch:


There's the PlayerCollision script, which determines the consequences of collision (damage, stabilization, and i-frames):

public class PlayerCollision : MonoBehaviour
{
    public PlayerMovement movement;
    //public ScriptableObject PlayerSO;

    public Rigidbody rb;
    public GameObject player;


    public bool isInvincible = false;
    public float invincibilityDurationSeconds = 1.5f;
    public float invincibilityDeltaTime= 0.15f;
    public float smooth = 5.0f;


    private Vector3 defaultSize;
    private float direction;

    void Start()
    {
        // Debug.Log(player.transform.rotation);
        defaultSize = player.transform.localScale;
    }

    //rotates player to be level (x,z) with the ground
    private void StableUpdate(float direction)
    {
        //define stability
        Quaternion target = Quaternion.Euler(0, direction, 0);

        // Dampen towards the target rotation
        player.transform.rotation = Quaternion.Slerp(player.transform.rotation, target,  Time.deltaTime * smooth);

        if (Math.Abs(player.transform.rotation.x) > 0 && Math.Abs(player.transform.rotation.x) < 0.01)
        {
            player.transform.rotation = target;
        }


    }

    private IEnumerator BecomeTemporarilyInvincible()
    {
        Debug.Log("Player turned invincible!");
        isInvincible = true;


        for (float i = 0; i < invincibilityDurationSeconds; i += invincibilityDeltaTime)
        {
            if (player.transform.localScale == defaultSize)
            {
                player.transform.localScale = new Vector3(0, 0, 0);
            }
            else
            {
                player.transform.localScale = defaultSize;
            }


            yield return new WaitForSeconds(invincibilityDeltaTime);
        }

        player.transform.localScale = defaultSize;


        isInvincible = false;
        Debug.Log("Player is no longer invincible!");
    }

    void OnCollisionEnter(Collision collisionInfo)
        {
            if (collisionInfo.collider.tag == "Obstacle")
            {
                //is player invincible?
                if (isInvincible) return;

                //if not, take damage
                movement.health -= 10;
                Debug.Log("Health: " + movement.health);
                StartCoroutine(BecomeTemporarilyInvincible());

                //if health is 0, player dies
                if (movement.health <= 0)
                {
                    movement.enabled = false;
                    rb.useGravity = true;
                    //death event
                    //FindObjectOfType<GameManager>().EndGame();
                }


            }
        }

    void Update()
    {

        if (Math.Abs(player.transform.rotation.x) > 0  || Math.Abs(player.transform.rotation.z) > 0 )
        {
            //Debug.Log("Player is not level with the ground! Rotation, direction: " + player.transform.rotation + ", " + direction);
            StableUpdate(direction);
        }
        else
        {
            //take direction
            direction = player.transform.rotation.y;
        }


    }
}

And the ThirdPersonMovement script, which sets the direction based on the cinemachine camera and player controller, plus elevation based on button inputs.

public class ThirdPersonMovement : MonoBehaviour
{
    public CharacterController controller;
    public Transform cam;
    private UnityEngine.Vector3 playerVelocity = UnityEngine.Vector3.zero;

    public float speed = 2.0f;
    public float acceleration = 2.0f;
    public float maxSpeed = 15f;

    //determines turn radius. Smaller = sharper
    public float turnSmoothTime = 0.01f;
    float angleVelocity;

    void Update()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        UnityEngine.Vector3 direction = new UnityEngine.Vector3(horizontal, 0f, vertical).normalized;
        //UnityEngine.Vector3 targetVelocity = direction*speed;

        if (direction.magnitude >= 0.1f)
        {
            //rotates the player in the direction of the camera
            float targetAngle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg + cam.eulerAngles.y;
            float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetAngle, ref angleVelocity, turnSmoothTime);
            transform.rotation = UnityEngine.Quaternion.Euler(0f, angle, 0f);

            //sets the player in the direction of the camera
            UnityEngine.Vector3 moveDir = UnityEngine.Quaternion.Euler(0f, targetAngle, 0f) * UnityEngine.Vector3.forward;
            // Debug.Log("Player Velocity: " + playerVelocity + " MoveDir: " + moveDir);

            // Smoothly change the velocity. Consider inertia
            playerVelocity = UnityEngine.Vector3.Lerp(playerVelocity, moveDir, acceleration * Time.deltaTime);

            //moves the player in the direction of the camera
            controller.Move(playerVelocity.normalized * speed * Time.deltaTime);
        }

        // Increases the height position of the player.
        if (Input.GetKey("q"))
        {
            playerVelocity.y += Mathf.Sqrt(speed * 0.01f );
            playerVelocity.y = Mathf.Clamp(playerVelocity.y, 0, maxSpeed);

            controller.Move(playerVelocity * Time.deltaTime);
        }

        // Decreases the height position of the player.
        if (Input.GetKey("e"))
        {
            playerVelocity.y -= Mathf.Sqrt(speed * 0.01f);
            playerVelocity.y = Mathf.Clamp(playerVelocity.y, -maxSpeed, 0);

            controller.Move(playerVelocity * Time.deltaTime);
        }
    }
}

Issue Description:
Player Object doesn't collide with the ground when descending, but it phases into obstacle-tagged terrain and gets 'spat' out without stabilizing properly.

Update: Earlier, a fantastic tech wizard pointed out that my issue stems from my collider. Had I read the documentation, I would have realized the Character Controller already comes with its own rigid body and collider. Neat! For anyone else with this issue, I recommend using OnControllerColliderHit() instead of stacking colliders.

These two threads are also helpful:

The wizard blessed this thread with forbidden knowledge (they turned 50 lines into 10) that I didn't have time to implement before they were banished (post gone :'( ). Thank you, wherever you are.