My confusion about automatic safe area insets was due to a single dropdown in a collection view's storyboard:
The storyboard was using "Content Inset", which I'm thinking might be a default value. Everything works fine after changing the dropdown to "Safe Area" (and a sectionInsetReference="safeArea" attribute is added to the storyboard object graph).
This setting also led me to believe that table views didn't handle the situation automatically (they do).
It seems to me that "Safe Area" is a better default these days - there are probably compatibility issues I'm not aware of, but folks moving their storyboards to the Duo will likely hit this issue and be confused just like I was.
Topic:
UI Frameworks
SubTopic:
UIKit