Instead of forcing Controllers to expose and manage keys, we can define interfaces that act as interests. It's then possible to query all controllers that are interested (e.g. implement the interface). This would allow the VisibilityController to feed the visibility status to dependencies.
I will have to think more about which direction is better. It may be possible that this interest concept can be used to describe data/processing dependencies as well and help support parallel execution.