Why does the FreezeRotation constraint still allow the rotation to be modified?

I have a very basic script attached to a cube in my scene.

using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
    Rigidbody rb;

    void Awake()
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;
        rb.constraints = RigidbodyConstraints.FreezeAll;

    void FixedUpdate()
        Quaternion deltaRotation = Quaternion.Euler(Vector3.up * 20f * Time.fixedDeltaTime);
        rb.MoveRotation(rb.rotation * deltaRotation);

        Vector3 deltaPosition = transform.TransformDirection(Vector3.up * 20f) * Time.fixedDeltaTime;
        rb.MovePosition(rb.position + deltaPosition);

The cube is visibly rotated each time FixedUpdate is called, however it’s position is not updated until the constraints are removed.

Why does FreezeRotation allow updates while rotation constraints are enabled, but FreezePosition really does prevent position updates?

I tried with both direct assignment to rotation and position properties, and using MoveRotation and MovePosition methods.

I’m still on day 0 of playing with Unity, so forgive me if there’s an obvious explaination. I can’t find it!

Because the rule is always if you don’t want your script to change something, then write your script that way. You never have or need a special command to lock a script variable. It would seem bizarre to programmers if a Unity command ever did that.

In other words, you need a special command to freeze physics-based rotation. But everyone knows you never need a special command to lock transform.rotation. You can just write if(myNoSpinVar==false) // change rotate here. Or write a small rotation class with a lock() function you write yourself.

Another way of thinking of it – what if you need to freeze physics-based rotation, but want to rotate in code? It’s better to have freezing only affect physics-based.