Recently I was tying myself in knots trying to work out why certain blocks weren't displaying. Long story short, the problem ended up coming from a custom condition plugin that didn't cover for enough use cases.
I ended up tracking down the problem by debugging my way through the block condition logic. In BlockRepository::getVisibleBlocksPerRegion() it checks the access logic for each block