Encapsulation & Information Hiding
Keeping implementation behind stable boundaries, and the sharper idea underneath it: hide the decisions most likely to change.
Callers reach state through operations that can enforce a rule, rather than through the data itself — so the rule has somewhere to live.
Parnas's real argument: decompose around the decisions most likely to change, so that when one changes it changes inside one module.
The interface is what a caller must know. Design it from what the caller is trying to do, not from what the module happens to have lying around.
Three quiet ways a boundary leaks: a getter that returns mutable internals, a public field that becomes a contract, and an interface that grew to mirror its only implementation.
A boundary is worth depending on when it changes more slowly than what sits behind it. If it changes at the same rate, it is a forwarding address.