DeriveWhen
DebugAlmost always — enables {:?} printing
CloneWhen copying the value makes semantic sense
CopyWhen type is small, stack-only, and implicit copy is fine (requires Clone)
PartialEq / EqWhen equality comparison makes sense
PartialOrd / OrdWhen ordering makes sense
HashWhen used as HashMap/HashSet key (requires Eq)
DefaultWhen a sensible zero/empty value exists
Serialize / DeserializeWhen crossing API/file boundaries (via serde)

Practical default: slap #[derive(Debug, Clone)] on almost everything. Add the rest as needed.