Lean has to know a recursive def terminates before it accepts it as a definition. Structural recursion is found automatically. Otherwise it tries well-founded recursion, and you help with termination_by to name a measure and decreasing_by to prove each call shrinks it.
The Collatz step count has no known measure. Nobody has proved that function terminates on every input. So you write partial def. Lean compiles it and runs it. It asks that the return type be inhabited, and in proofs the definition is opaque. You can evaluate it. You cannot reason about its unfolding.
That is the trade I like. The keyword is the specification telling the truth. A total def says the function returns on every input, and the checker holds you to it. partial says nothing of the kind.
Any checker that always answers must refuse some functions that do terminate. Fine. The cost of that refusal is one honest keyword, and the program still runs.

