Another thing that comes to mind is that features on private dependencies don't need to be unified with other uses of the same crate elsewhere in the tree (though unification is probably wanted to reduce compile time and binary sizes in most cases). Some mode to do this could help with "you're assuming features implicitly enabled elsewhere in the dependency graph" detection.
Another complication is that some crates can communicate at link time using crates like inventory
where you want all consumers of some inventory-providing crate to agree on a single version so that all consumers see the same array at runtime.