The creation of a system of objects is difficult because it is universally difficult to encapsulate knowledge in a clean way. Think of any system in society—particularly the ones that work well—and you find parts of it work in spite of the system.
A particular someone knows how to do something not in their job description. They become the glue that keeps large parts of the engine working. It was not prescribed but came organically. Someone gained knowledge of something to make the process more efficient. Someone expanded their role to fill in those gaps that need filling.
And yet, when it comes to object-oriented programming, we hope to find these very clean lines of separation. This class knows about this but not that; that class knows about this but not in the specific way the other knows about it. All sorts of mental gymnastics to get the players on the field doing just their own thing, living in their own strange world, harmoniously with the others.
But those gaps arise. Of course they do.
And we, as programmers, fill in those gaps in onerous ways. At least it feels that way to us.
Maybe a private property needs to surface publicly so another object can have at it. And that irks us because it feels like happenstance that it should be exposed. Maybe some piece of information needs to be globally accessible. We let out a mental gasp before giving in.
Try adhering too much to perfect encapsulation (whatever that means to you) and you get a pure system that is convoluted. Too much formality to manage. What I'm striving for is that delicate balance where encapsulation is a strong suggestion but disappears when it should. When it should is a concept that changes over time.
The needle is always wavering.