You need to merge different precedence levels, otherwise you lose default attributes in recipes.
default['foo']['package'] = "foobar"
default['foo']['children']['min'] = 3
default['foo']['children']['max'] = 3
default['foo']['port] = [ '8080' ]
override['foo']['port'] = [ "8443" ]
Chef 11: node['foo']['port'] = [ "8080", "8443" ]
Chef 10: node['foo']['port'] = [ "8443" ]
The difference being
CHEF-2936 made it so attributes are loaded and then calculated based on precedence, rather than attempting to load them based on precedence order. This is a bug that was somewhat unique to how roles were handled.
Chef 11 also has a "new" set of precedence levels where you can force what you want a particular level to be. In a recipe:
node.override!['foo']['port'] = "6667"
Chef 11: node['foo']['port'] = "6667"
This is meant to be used when you're programmatically deciding what's best yourself. There's no way to use these in a node object themselves, e.g. by setting node[:override!], because that's global thermonuclear attribute warfare and we just want peace.