Parnas wrote down the test in 1972 and most codebases still fail it. A module is characterised by the design decision it hides from every other module. That's the whole rule. Private fields, protected methods, a tidy export list, none of that counts for anything if the decision underneath is still visible to everyone who calls in.
The getter and setter pair. A class takes a field private, then exposes read and write for it. Every caller can reach in and set the thing, so the module has fused itself to every callsite that knows about its insides, exactly as if the field had been public. The keyword did the syntactic part and nobody did the design part. The field is private and the decision is not.
A module exporting a helper that one caller uses is the same failure at the file level. The boundary is theatrical. If only one caller needed it, the helper belongs inside that caller, and leaving it on the public surface tells every future reader that it's part of the contract when it isn't.
Agents have made this worse rather than better. Handed a class with a getter for every field, an agent reads the getters as the vocabulary of the module and builds on them. A person might notice the shape is thin and go and look, an agent takes the surface as the contract, because the surface is what it was given. Two getter-and-setter classes and the decision that was supposed to be hidden is now the interface for the next twenty files.
The surface is the meaning, because the surface is what gets copied.
https://prickles.org/tenet/encapsulation/F6