- Leave the `else` off a `when` over a sealed type. Exhaustiveness turns the compiler into your ticket list, and the branch you deleted was the one that would have swallowed tomorrow's subclass.
- Make it a `data class` only when callers will destructure and call `copy()` forever. Equality is cheap to add later; a public `copy()` on an evolving type is never cheap to take away.
- Default arguments delete the builder and the overload ladder. Add `@JvmOverloads` the day a real Java caller exists, never on the chance that one might.
- Delegate the interface with `by` before hand-writing a third forwarding method, and override only the member you came to change. The other twenty stay unwritten and stay correct.
- A test seam wants a function type, not an interface. Classes are final by default, a nudge to pass the one lambda you call instead of extracting an interface, an impl, and a fake.
