At the moment, the default groupId in the consumer is "". If you try to use this to subscribe() to a topic, the broker will reject the group as invalid. On the other hand, if you use it with assign(), then the user will be able to fetch and commit offsets using the empty groupId. Probably 99% of the time, this is not what the user expects. Instead you would probably expect that if no groupId is provided, then no committed offsets will be fetched at all and we'll just use the auto reset behavior if we don't have a current position.
Here are two potential solutions (both requiring a KIP):
1. Change the default to null. We will preserve the current behavior for subscribe(). When using assign(), we will not bother fetching committed offsets for the null groupId, and any attempt to commit offsets will raise an error. The user can still use the empty groupId, but they have to specify it explicitly.
2. Keep the current default, but change the consumer to treat this value as if it were null as described in option 1. The argument for this behavior is that using the empty groupId to commit offsets is inherently a dangerous practice and should not be permitted. We'd have to convince ourselves that we're fine not needing to allow the empty groupId for backwards compatibility though.